gpt4 book ai didi

Python list.append 输出值与 list.extend 不同

转载 作者:行者123 更新时间:2023-12-01 03:35:16 24 4
gpt4 key购买 nike

在另一个网站上看到一个关于一段让人抓狂的 Python 代码的问题。这是一段相当小、看起来很简单的代码,所以我看着它,弄清楚它想要做什么,然后在我的本地系统上运行它,并发现为什么它让最初的提问者发疯。希望这里有人可以帮助我了解发生了什么事。

代码似乎很简单“要求用户提供三个值 (x,y,z) 和一个总和 (n);迭代所有值以查找总和为 n 的元组,并将这些元组添加到列表中。 ”解决方案。但它输出的是,不是所有总和为 n 的元组,而是一个元组列表,其计数等于总和为 n 的元组计数,但其内容都是“[x,y,z] ”。为了解决这个问题,我将追加调用更改为扩展调用(知道这会取消列出添加的元组),以查看行为是否发生了变化。我期望得到相同的输出,就像重复“x,y,z,x,y,z...”,而不是重复“[x,y,z],[x,y,z]”,因为当我阅读并理解 Python 文档时,这就是列表上的追加和扩展之间的区别。当我使用extend时,我得到的是总和为n的元组的正确值,只是通过extend打破了它们的元组形式。

这是问题代码:

my = []

x = 3
y = 5
z = 7
n = 11

part = [0,0,0]
for i in range(x+1):
part[0] = i
for j in range(y+1):
part[1] = j
for k in range(z+1):
part[2] = k
if sum(part) == n:
my.append(part)
print(my)

和输出:

[[3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7], [3, 5, 7]]

这是扩展输出:

[0, 4, 7, 0, 5, 6, 1, 3, 7, 1, 4, 6, 1, 5, 5, 2, 2, 7, 2, 3, 6, 2, 4, 5, 2, 5, 4, 3, 1, 7, 3, 2, 6, 3, 3, 5, 3, 4, 4, 3, 5, 3]

以及扩展代码:

my = []

x = 3
y = 5
z = 7
n = 11

part = [0,0,0]
for i in range(x+1):
part[0] = i
for j in range(y+1):
part[1] = j
for k in range(z+1):
part[2] = k
if sum(part) == n:
my.extend(part)
print(my)

任何可以阐明这一点的线索将不胜感激。我在 Google 和几个问答网站上研究了一段时间,我发现的有关 Python 追加/扩展增量的唯一内容似乎与此问题没有任何相关性。

{编辑:环境详细信息}

此外,在 Python 2.7.10 和 Python 3.4.3(cygwin,在 Windows 10 home 下)中运行此代码,结果相同。

最佳答案

extend 将参数列表中的项目添加到进行调用的列表对象中。更像是,将对象从一个列表转储到另一个列表,而不清空前者。

append 另一方面,只是appends;而已。因此,将一个列表对象 append 到另一个列表以及对 append 列表的现有引用可能会造成一些损害 - 正如本例所示。 append 列表后,part 仍然保留对列表的引用(因为您正在就地修改),因此您实际上是在修改并(重新)每次都 append 相同的列表对象。

您可以通过在append案例的每个迭代开始时构建一个新列表来防止这种情况。

或者简单地 append part 列表的副本:

my.append(part[:]) 
my.append(list(part))
my.append(part.copy()) # Python 3 only

这将追加一个列表,该列表在其新父列表之外没有其他现有引用。

关于Python list.append 输出值与 list.extend 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40445588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com