用for调用generator的时候,是创建了多个对象,还是一个对象在不停更新对象的内容呢?
Topic source但是很诡异的,下面这段代码,却是正确的,不需要用results.append(list(n))
def fib(max):
n, a, b = 0, 0, 1
while n < max:
#yield b
a, b = b, a + b
n = n + 1
t=[a,b]
yield t
return 'done'
results = []
for n in fib(6):
print(n)
results.append(n)
print(results)
- 1
渚薰ζ囧囧Mei
编写的代码如下:
有个困惑,需要将测试代码中的这一行
results.append(t)
更改成如下这一行,测试才通的过
results.append(list(t))
否则的话,results里面每个元素都指向同一个内存地址,每次执行generator,生成新的 t,会导致results所有的元素都更新成新t。
需要用append(list(t)),才能让results的元素保留前一个t值。
不知道是不是因为我写triangles的方式导致有这个问题,还是说是generator的特性导致会有这样的结果
按照“ 请务必注意:调用generator函数会创建一个generator对象,多次调用generator函数会创建多个相互独立的generator。”
那用for调用generator的时候,是创建了多个对象,还是一个对象在不停更新对象的内容呢?
def triangles():
i=0
tri=[]
while True:
tem=[]
for x in range(len(tri)):
tem.append(tri[x])
tri.append(1)
l=1
while l < len(tri)-1:
tri[l]=tem[l-1]+tem[l]
l=l+1
i=i+1
yield(tri)
n = 0
results = []
for t in triangles():
print('t',t)
results.append(list(t))
print('r',results)
n = n + 1
if n == 10:
break
if results == [
[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1],
[1, 8, 28, 56, 70, 56, 28, 8, 1],
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
]:
print('测试通过!')
else:
print('测试失败!')