在Python中,变量总是一个指向对象的指针,而不是可改变的内存区域的标签:给一个变量赋一个新的值,并不是替换了原始对象,而是让这个变量去引用完全不同的一个对象。实际的效果就是对一个不支持原处修改的变量赋值,仅仅会影响那个被赋值的变量。但对于支持在原处修改的对象,共享引用时需倍加小心,因为对一个变量名的修改会影响其他的变量。
如下图:

可见,对不可变对象(数字,字符串,元组等)的共享引用,改变一个变量不会影响另一个变量。

而对于可变对象(列表,字典,集合等)的共享引用,当修改一个变量所引用对象的值时,会影响到另一个变量。
要想避免这种情况发生,需要拷贝对象,而不是创建引用。
Python中有很多拷贝一个列表的方法,包括内置列表函数以及标准库的copy模块等。但最常用的办法就是从头到尾分片。

但分片这种技术不能应用在字典,集合这样的核心类型上,因为它们不是序列。
复制一个字典或集合应该使用X.copy()方法:
import copy
a = copy.copy(b)
c = copy.deepcopy(d) #深度拷贝,拷贝嵌套对象
本文介绍了Python中对象拷贝的概念,区分了不可变对象与可变对象在赋值过程中的不同行为。对于不可变对象,如数字、字符串等,改变一个变量不会影响其他变量;而可变对象如列表、字典等,修改一个变量会影响到其他变量。文章还提供了如何正确拷贝这些对象的方法。
398

被折叠的 条评论
为什么被折叠?



