【发布时间】:2019-10-16 04:44:11
【问题描述】:
我不明白为什么下面代码的结果是[1,[2,5]] 而不是[3,[2,5]]。为什么子列表中的元素发生了变化,而子列表之外的元素却没有?
我是 Python 新手,所以也许我看不到应该很明显的东西。我读过关于深拷贝和浅拷贝的文章,但没有帮助。
a = [1,[2,3]]
b = a[:]
a[0] = 3
a[1][1] = 5
print(b)
我在第 2 行创建了列表切片。但由于它没有开始或结束值,切片等于整个列表,对吗?那为什么 3 变成 5,而 1 还是一样呢?
【问题讨论】:
-
这是一个浅副本,
a[1]仍然是原始(可变)列表。 -
浅拷贝创建一个新容器,但仍将引用放在新容器/列表中。如果您希望确保不保留任何引用,请进行深度复制。
-
我至少看过一本书和几个在线资源声称
b = a[:]是深拷贝——他们错了。见标准库copy.deepcopy()docs.python.org/3.7/library/copy.html