【发布时间】:2017-03-19 15:21:47
【问题描述】:
在另一个网站上看到一个关于一段让某人发疯的 Python 代码的问题。这是一段相当小、看起来很简单的代码,所以我查看了它,弄清楚它想做什么,然后在我的本地系统上运行它,并发现它为什么会让最初的提问者发疯。希望这里的人可以帮助我了解发生了什么。
代码似乎是一个简单的“向用户询问三个值 (x,y,z) 和一个总和 (n);迭代所有值以找到总和为 n 的元组,并将这些元组添加到列表中。 "解决方案。但它输出的不是所有总和为 n 的元组,而是一个元组列表,其计数等于总和为 n 的元组的计数,但其内容都是 "[x,y,z] ”。为了解决这个问题,我将附加调用更改为扩展调用(知道这将取消列出添加的元组),以查看行为是否发生了变化。我希望得到相同的输出,就像 "x,y,z,x,y,z..." 重复,而不是 "[x,y,z],[x,y,z]" 重复,因为当我阅读并理解 Python 文档时,这就是列表中追加和扩展之间的区别。相反,当我使用扩展时,我得到的是总和为 n 的元组的正确值,只是通过扩展打破了它们的元组形式。
问题代码如下:
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 下)运行此程序,结果相同。
【问题讨论】: