Python列表引用规则疑问:修改arr2为何有时不影响arr1?
Python列表引用机制差异原因说明
你提到的示例代码如下:
arr1 = [] arr2 = [1, 2] arr1.append(arr2) #arr2[0] = 5 arr2 = [6] print(arr1)
Python中的变量本质是指向内存中对象的标签,而非对象本身,你观察到的差异本质是修改可变对象本身和给变量重新赋值两种操作的本质区别:
- 执行
arr2 = [1, 2]时:内存中生成一个存储[1,2]的列表对象,变量arr2是绑定到这个对象内存地址的标签 - 执行
arr1.append(arr2)时:是将arr2当前绑定的列表对象的引用存入arr1,此时arr1[0]和arr2指向内存中的同一个列表对象 - 若执行
arr2[0] = 5:这是对arr2当前指向的列表对象本身做内容修改,没有改变arr2的绑定指向,同一个内存地址的内容更新后,指向该地址的arr1[0]自然会同步显示变化 - 若执行
arr2 = [6]:这是给变量arr2重新绑定新对象,会在内存中生成新的存储[6]的列表对象,再把arr2这个标签从原[1,2]对象的地址移到新对象的地址,原[1,2]对象仍然存在且arr1[0]仍然指向它,所以不会对arr1产生任何影响
如果希望把arr2存入arr1后,修改arr2的元素也不会影响arr1,就需要做拷贝操作,示例如下:
arr1.append(arr2.copy()) # 浅拷贝,适用于列表元素都是不可变类型的场景 # 或者 from copy import deepcopy arr1.append(deepcopy(arr2)) # 深拷贝,适用于列表嵌套可变对象的场景
内容的提问来源于stack exchange,提问作者Derek_Y
相关产品推荐
相关产品推荐

