(1)赋值语句“=”的理解
在Python中,对象的管理是通过对象引用计数器来实现的。如果某个对象的引用计数器变为0时,那么该实例化对象将无法再被获取,系统会自动将其消亡并回收相应的内存,这也是内存管理机制。而赋值语句,其实就是将一个对象的引用传递给某个变量,具体解释看下面的例子。
</pre><p></p><pre name="code" class="python">>>>> x=[1,2,3]
>>> y=x
>>> x=[]
>>> y
[1, 2, 3]
>>>
在上述例子中,我创建了一个列表对象,并将该对象的引用赋值给了x;接着,我又将该对象的引用通过x赋值给了y,这样y其实就是对列表[1,2,3]的引用。而x=[ ]语句,创建了一个空列表,并将引用赋值给x,此时x将不再指向列表[1,2,3]。
总结说来,赋值语句“=”伴随着对象引用的创建和转移。
(2)浅复制 copy()的理解
先看一个例子:
>>> x=[1,[2,3]]
>>> y=x.copy()
>>> y
[1, [2, 3]]
>>> y[0]=2
>>> x
[1, [2, 3]]
>>> y[1].append(4)
>>> y
[2, [2, 3, 4]]
>>> x
[1, [2, 3, 4]]
浅复制会创建新的内存来保存一些东西,但是它并不会将原对像进行彻底的复制。它会对字符串、数值类型进行值的复制,但是对列表、字典来说,它仅仅复制引用。也就是说,浅复制仅仅复制表层的一些东西,对于子对象并不复制。所以,可以看到,当对y的子列表修改时,x也会跟着变化。
(3)深复制 deepcopy()的理解
>>> from copy import deepcopy
>>> x=[1,[2,3]]
>>> y=deepcopy(x)
>>> y[1].append(4)
>>> y
[1, [2, 3, 4]]
>>> x
[1, [2, 3]]
>>>
与上面的例子相对比,可以看出,深复制会将原对象彻底的复制,无论是表层还是子对象。需要说明的一点是,在使用deepcopy()时,将先将模块导入。