我确信这个问题在很久以前就得到了解答,但是英语不是我的母语而且我的搜索非常糟糕所以请原谅。 我正在尝试通过为我的工作编写数据库来学习python,所以我遇到了这个问题。 简化代码的和平:
x=[[0,0],[0,0]]
y=x[0:]
y[0][0]="1"
print x
和输出:
[['1', 0], [0, 0]]
我明白我在这里缺少一些基本的东西,但为什么“x”和“y”一起改变了?所有答案都将不胜感激。
答案 0 :(得分:3)
使用x[0:]
不会创建“深层副本”;它本质上是复制对内部数组的引用,或者是“浅拷贝”,这样设置y[0]
或y[1]
不会改变x
,但是设置内部数组的项目会。 / p>
答案 1 :(得分:2)
y=x[0:]
这会复制列表x,但由于x的元素是数组,因此这些元素将被复制为引用。你需要的是复制x的每个元素。例如:
y = [val[:] for val in x]
然后改变y不会影响x。
编辑:
另一种适用于更广泛案例的替代方案就像建议deepcopy
一样。所以:
from copy import deepcopy
y = deepcopy(x)
这适用于嵌套列表和非可迭代元素。