Discuss / Python / yield 返回的是指针还是一份拷贝?

yield 返回的是指针还是一份拷贝?

Topic source

疾风_90334

#1 Created at ... [Delete] [Delete and Lock User]

做本章作业的时候,我写了一份比较笨的代码,如下:

    L=[]

    L.append(1)

    yield (L)

    L.append(1)

    yield (L)

    x=3

    while(x<=10):

        m = 1

        i = 0

        while(i < (x-2)) :

            L[m] = L[m-1]+L[m]

            m=m+1

            i = i+1

        L.append(1)

        x=x+1

        yield (L)

心想虽然代码看着笨,但是逻辑应该没啥大问题。但是,运行的时候我傻 了,以下是返回结果:

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

[1, 9, 43, 144, 376, 804, 1429, 2055, 2056, 1]

测试失败!

居然每一行都一样。我就不明白了。就算逻辑有问题,前两个yield 返回的L,第一个长度为1,第二个长度为2应该没啥问题,但是现在长度都为10,值都一样,使我严重怀疑yield返回的是一个指针(类似C的指针吧)。所以修改了一下代码,如下:(此段代码测试可以通过)

    L=[1,1,1]

    yield ([1])

    yield ([1,1])

    x=3

    while(x<=10):

        m = 1

        i = 0

        L2=[1]

        while(i < (x-2)) :

            L2.append(L[m-1]+L[m])

            m=m+1

            i = i+1

        L2.append(1)

        L = L2

        x=x+1

        yield (L)

前两次返回的不是L,后面返回的L其实都指向了一个新的L2。这样结果就没有问题了。但是这不知是否能够验证我的猜想。还请各位大神指教。

一隅天涯

#2 Created at ... [Delete] [Delete and Lock User]

我也遇到了同样的问题


  • 1

Reply