python:可变可迭代对象修改问题

在python中,可变对象在迭代时会发生错乱,如:

lst = [1, 2, 3, 4, 5]
for x in lst:
	if x%2==0:
		lst.remove(x) #remove,insert等操作
print(lst)
output:[1, 4, 3, 5]

解决办法是创建一个lst的浅拷贝lst[:]

lst = [1, 2, 3, 4, 5]
for x in lst[:]:   #注意此处修改
	if x%2==0:
		lst.remove(x) #remove,insert等操作
print(lst)
output:[1, 3, 5]

字符串是不可变对象,不会修改原始迭代器中元素,所以以上操作对字符串没有影响

python中的浅拷贝和深拷贝

如下例子,x和y都属于同一片内存空间,所以使用深拷贝,修改y会对x产生影响

x = [1, 2, 3, 4, 5]
y = x
y[0] = 4
print(x)  
output:[4, 2, 3, 4, 5]

那如何避免这中情况呢,如下使用浅拷贝,并不改变x的值

x = [1, 2, 3, 4, 5]
z = x[:]
z[0] = 4
print(x)  
output:[1, 2, 3, 4, 5]

但再看一个例子

x = [1, 2,[ 3, 4] ]
y = x[:]  #或者y = x.copy()
y[0], y[2][0]= 6, 6
print(x)  
output:[1, 2, [6, 4]]

一级元素没有变化,而二级元素被修改了

总结

浅拷贝只复制了父对象(一级元素),而不复制内部子对象
若想都复制,即都不改变,可用y = copy.deepcopy(x)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值