Discuss / Python / 用for调用generator的时候,是创建了多个对象,还是一个对象在不停更新对象的内容呢?

用for调用generator的时候,是创建了多个对象,还是一个对象在不停更新对象的内容呢?

Topic source

编写的代码如下:

有个困惑,需要将测试代码中的这一行

    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('测试失败!')

但是很诡异的,下面这段代码,却是正确的,不需要用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

Reply