在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)