Python复制列表中的列表元素并改值,结果连原来列表的值也被修改了

  • Post author:
  • Post category:python


一、python的=赋值的是地址

list1 = [1,['a','b']]
list2 = list1[-1]
# list1[-1]的内存地址,和list2的内存地址是一致的
print(id(list1[-1]))
print(id(list2))
# 此时改变list2的值,list1[-1]的值也会受到影响
list2.append('test')
print(list1)
print(list2)

控制台输出:
2398601627584
2398601627584
[1, ['a', 'b', 'test']]
['a', 'b', 'test']

可以看到,修改了复制出来的列表元素,原列表也会受到影响

这是因为python的=赋值的是地址,list1[-1]和list2指向的是同一个对象,id一样内存地址一样,因此修改list2后,list1[-1]也会跟着改变

二、浅拷贝copy()

list1 = [1,['a','b']]
list2 = list1[-1].copy()
# list1[-1]的内存地址,和list2的内存地址是不一样的
print(id(list1[-1]))
print(id(list2))
# 此时改变list2的值,list1[-1]就不会变了
list2.append('test')
print(list1)
print(list2)

控制台输出:
2958062668032
2958062668736
[1, ['a', 'b']]
['a', 'b', 'test']

可以看出,此时list1[-1]的内存地址,和list2的内存地址是不一样的,修改list2的值后,不会再影响list1[-1]的值

copy(),顾名思义,就是复制出一个对象,两个变量指向的对象不同,自然而然,修改其中一个变量的值,就不会影响到另一个变量的值

三、深拷贝deepcopy()

1、若是拷贝的结果list2存在多个可变对象,修改又只修改其中的一个可变元素时

list1 = [1,['a','b'],[1,2]]
list2 = list1[-2:].copy()
# 此时list2=[['a', 'b'], [1, 2]],存在两个可变对象

list2[0].append('test')
print(list1)
print(list2)

控制台输出:
[1, ['a', 'b', 'test'], [1, 2]]
[['a', 'b', 'test'], [1, 2]]

可以看到,修改完list2[0]后,list1[0]的值也受到了影响。

这是因为当列表中存在可变对象时,对可变对象的修改,浅拷贝之间是会互相影响的。

因此,这时就要用到深拷贝

list1 = [1,['a','b'],[1,2]]
list2 = copy.deepcopy(list1[-2:])

list2[0].append('test')
print(list1)
print(list2)

控制台输出:
[1, ['a', 'b'], [1, 2]]
[['a', 'b', 'test'], [1, 2]]

这样的话,list1和list2的值之间就不会互相干扰啦。

即使拷贝后变量存在多个可变对象,深拷贝后,多个变量之间的值不会受到影响

2、但若是对整个变量进行修改,浅拷贝也不会有问题

list1 = [1,['a','b'],[1,2]]
list2 = list1[-2:].copy()

list2.append('test')
print(list1)
print(list2)

控制台输出:
[1, ['a', 'b'], [1, 2]]
[['a', 'b'], [1, 2], 'test']



版权声明:本文为taylortiger原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。