当前位置 主页 > 网站技术 > 代码类 >

    Python的对象传递与Copy函数使用详解

    栏目:代码类 时间:2019-12-27 06:09

    1、对象引用的传值或者传引用

    Python中的对象赋值实际上是简单的对象引用。也就是说,当你创建一个对象,然后把它赋值给另一个变量的时候,Python并没有拷贝这个对象,而是拷贝了这个对象的引用。这种方式相当于值传递和引用传递的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值--相当于通过“引用传递”来赋值。如果函数收到的是一个不可变变量(比如数字、字符串或者元祖)的引用,就不能直接修改原始对象--相当于通过“值传递”来赋值。

    先看一个数字传递的例子:

    >>> def test(a):
    ...     print id(a)
    ...     a = a + 1
    ...     print id(a)
    ...     return a
    ...
    >>> b =19
    >>> id(b)
    38896272
    >>> c = test(b)
    38896272
    38896260
    >>> id(b)
    38896272
    >>> b
    19

    id函数可以获得对象的内存地址.

    很明显从上面例子可以看出,将b变量作为参数传递给了test函数,传递了b的一个引用,把b的地址传递过去了,所以在函数内获取的变量a的地址跟变量b的地址是一样的,但是在函数内,对a进行赋值运算,a的值从19变成了20,实际上19和20所占的内存空间都还是存在的,赋值运算后,a指向20所在的内存。而b仍然指向19所在的内存,所以后面打印b,其值还是19.

    另外,关于整数变量的id,所有在[-5,256]范围内的整数,python是提前分配好空间放在数组里初始化好的,所以两个变量如果是相同的小整数,对象都是最开始初始化的那一个,所以两个变量的id是一样的。

    所有在[-5,256]范围外的整数的话,每次都会新建一个的,所以id会改变

    >>> a = 256
    >>> id(a)
    43340980
    >>> b = 256
    >>> id(b)
    43340980   # a和b的id相同
    >>> a = 257
    >>> id(a)
    44621040
    >>> b = 257
    >>> id(b)
    44620908   # a和b的id不同
    >>> a = -5
    >>> id(a)
    43338160
    >>> b = -5
    >>> id(b)
    43338160
    >>> a = -6
    >>> id(a)
    44621184
    >>> b = -6
    >>> id(b)
    44621112

    再看一个列表传递的例子:

    >>> def test(a):
    ...   print id(a)
    ...   a[0] = 100
    ...   print id(a)
    ...   return a
    ...
    >>> b = [7,8,9,10]
    >>> id(b)
    46408088
    >>> c = test(b)
    46408088
    46408088
    >>> id(b)
    46408088
    >>> b
    [100, 8, 9, 10]

    从上面例子可以看出,将b变量作为参数传递给了test函数,传递了b的一个引用,把b的地址传递过去了,所以在函数内获取的变量a的地址跟变量b的地址是一样的,但是在函数内,对a进行赋值运算,a[0]的值从7变成了100,但是a的id并没有发生变化,还是和变量b的地址是一样的,所以后面打印b,b[0]的值也从7变成了100.

    2、关于可变变量和不可变变量:

    这里的可变不可变,是指内存中的那块内容(value)是否可以被改变

    不可变变量:

    number: int, float, str, 元组。--指它的部分(比如element,attribute不能改变)不能改变;并不是整体不可变。另外,Python所有变量皆对象。int也是一个对象。

    >>> a = 10000
    >>> id(a)
    46573412
    >>> a = 10000000
    >>> id(a)
    46573460   #数字变量重新赋值后,id发生了变化
    >>> s = 'abc'
    >>> s[1] = d   #字符串变量中的某一个元素不能进行改变
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
    TypeError: 'str' object does not support item assignment
    >>> id(s)
    39103328
    >>> s = 'ttt'
    >>> id(s)    #字符串变量进行重新赋值后,id发生了变化
    46425368