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

文章详细阐述了Python中赋值操作、浅拷贝`copy()`以及深拷贝`deepcopy()`的概念和区别。通过示例代码解释了如何通过赋值、浅拷贝和深拷贝创建列表的副本,并分析了在修改副本时如何影响原始列表,强调了在处理包含可变对象的列表时深拷贝的必要性。
摘要由CSDN通过智能技术生成

一、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']

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值