【发布时间】:2021-02-24 04:56:08
【问题描述】:
我是 Python 的新手,我正在学习它。
这里我想用一个生成器来输出帕斯卡三角。我想得到这样的输出
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
我写的是
# Pascal's Triangle
def triangles() :
result = [1]
while True :
# if i use yield result, the output will be [1, 0], [1, 1, 0] ...
yield result[:]
result.append(0)
result = [result[i]+result[i-1] for i in range(len(result))]
# make a list of the triangles.
n = 0
results = []
for t in triangles():
results.append(t)
n = n + 1
if n == 5:
break
for t in results:
print(t)
此代码运行良好。但是,当我将yield result[:] 更改为yield result 时,输出为
[1, 0]
[1, 1, 0]
[1, 2, 1, 0]
[1, 3, 3, 1, 0]
[1, 4, 6, 4, 1]
调试代码后发现迭代变量t运行后变为[1, 0]
result.append(0)
第一次,但没有return或yield之类的词。
为什么会这样?
更新问题
我在这里做了一个最小的工作示例
def func():
a = [1, 2]
while True :
yield a
a.append(0)
# # PM 1 (Print Method 1)
# n = 0
# results = []
# b = func()
# for t in b:
# results.append(t)
# n = n + 1
# if n == 3:
# break
# for t in results:
# print(t)
# PM 2
b = func()
counter = 0
for i in b :
print(i)
counter += 1
if counter == 3:
break
当我使用PM 1 打印列表时,我得到了
[1, 2, 0, 0]
[1, 2, 0, 0]
[1, 2, 0, 0]
当我使用PM 2 打印列表时,我得到了
[1, 2]
[1, 2, 0]
[1, 2, 0, 0]
所以我认为问题在于我如何打印列表。
【问题讨论】:
-
在提问之前,您是否阅读了
[:]的作用? -
虽然您确实尝试过调试它。
-
result[:]创建result到yield的副本。如果您不制作副本,那么随后的.append(0)就会像您所看到的那样显示在结果中。 -
@rdas 好吧,我明白你说的。但是在我看来,
yield发生在变量result更改之前,我的意思是当python 第一次看到yield result时,t得到[1],然后result.append(0)起作用。我认为我至少应该在results中获得[1],但我没有。