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问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用单行for循环python追加到一个空列表

使用for循环(Python)追加/连接多个excel数据集

如同在python中一样,在for循环中追加值

如何在python中使用for循环进行追加工作

不能用swift在for循环中追加一个数组?

Python的循环正确的操作使用方法详解