我使用生成器生成一些列表。但是,它不像我预期的那样工作。我首先使用 numgen1 来生成列表,但它不能正常工作。然后我切换到 numgen2 ,它可以正确地给我想要的东西。但是 numgen1 和 numgen2 基本相同(至少我认为),为什么它们的行为如此不同?谁能给我一些解释?
def numgen1(start, end, delta):
curr=start
while curr[1] < end[1] or curr[2]<end[2]:
yield curr
curr[2] += delta
print 'Output1: ', [ i for i in numgen1([1,1,1],[1,1,5],1)]
def numgen2(start, end, delta):
curr=start
while curr[1] < end[1] or curr[2]<end[2]:
yield [curr[0], curr[1], curr[2]]
curr[2] += delta
print 'Output2: ', [ i for i in numgen2([1,1,1],[1,1,5],1)]
这是输出。
Output1: [[1, 1, 5], [1, 1, 5], [1, 1, 5], [1, 1, 5]]
Output2: [[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4]]
跟进问题:
在阅读了 unutbu 的答案后,我又编写了一个生成器,用于测试 unutbu 所说的内容。但是生成器的行为并不像 unutbu 所说的那样。我很困惑生成器是生成指针还是值的副本。
def numgen3(start, end, delta):
curr=start
while curr<end:
yield curr
curr += delta
print list(numgen3(1,10,1))
这是输出。[1、2、3、4、5、6、7、8、9]
这次我尝试生成一些数字而不是一些列表。但是为什么不是列表中的所有元素都是 9?我没有创建一个新号码,我只是产生了相同的号码(curr)。我预计 numgen3 的结果应该与 numgen1 的结果相似。