for循环和追加的Python问题[重复]
Posted
技术标签:
【中文标题】for循环和追加的Python问题[重复]【英文标题】:Python issue with for loop and append [duplicate] 【发布时间】:2020-10-10 16:51:19 【问题描述】:我无法理解一段 python 代码的输出。
mani=[]
nima=[]
for i in range(3)
nima.append(i)
mani.append(nima)
print(mani)
输出是
[[0,1,2], [0,1,2], [0,1,2]]
我一生都无法理解为什么不是
[[0], [0,1], [0,1,2]]
非常感谢任何帮助。
【问题讨论】:
您将nima
(不是nima
的副本)附加到mani
3 次,所以它出现了3 次。
使用docs.python.org/3/library/copy.html#module-copy 来避免这种行为。正如一些人所建议的,您使用的是指针而不是副本,
【参考方案1】:
这是因为当您将 nima 附加到 mani 时,它不是 nima 的副本,而是对 nima 的引用。
所以随着 nima 的变化,mani 中每个位置的引用都指向变化的 nima。
由于 nima 以 [0, 1, 2] 结尾,因此附加到 mani 中的每个引用都指向同一个对象。
【讨论】:
因为 List 是可变的,它可以在创建后更改。 :) 啊哈,这就是我理解的漏洞。我过去主要使用matlab,如果我没记错的话,它可以与副本一起使用,而不是在这种情况下引用(我认为无论如何!)。非常感谢。【参考方案2】:按照某些人的建议完成,您应该使用copy
模块。您的代码如下所示:
import copy
mani=[]
nima=[]
for i in range(3):
nima.append(i)
mani.append(copy.copy(nima))
print(mani)
输出:
[[0], [0, 1], [0, 1, 2]]
【讨论】:
是否有理由使用copy.copy()
而不是list.copy()
?即mani.append(nima.copy())
【参考方案3】:
List 是可变的(可变序列创建后可以更改),可以看到使用 id 函数对同一个对象进行操作:
for i in mani:
print(id(i))
【讨论】:
以上是关于for循环和追加的Python问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章