Discuss / Python / 图中代码可以正常运行 但是如果将t0=t[:] results.append(t0)改为results.append(t)就会不通过,最后results每一个元素都是一样的了

图中代码可以正常运行 但是如果将t0=t[:] results.append(t0)改为results.append(t)就会不通过,最后results每一个元素都是一样的了

Topic source

def triangles():

    t=[]

    for i in range(10):

        t.append(1)

        t0 = t[:]

        for j in range(1,len(t)-1):

            t[j]=t0[j-1]+t0[j]

        yield t

    return 'done'

n = 0

results = []

for t in triangles():

    print(t)

    t0=t[:]

    results.append(t0)

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

唔啦啦poi

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

我一开始的情况与你所说的一样,所以很感谢你告诉我可以用t =t[:]来解决问题。关于这个问题我的理解是,append()追加的是对象的引用,t发生变化results的值也相应的发生变化。t0=t[:],或t=t[:](使用切片操作实现深拷贝)都能得到正确结果。因为每次循环都会有一个新的局部变量t0或t产生,这些局部变量虽然同名但互不干扰。还有一点值得注意的是:for循环中的循环变量(t)是上下文可见的,但它又不是全局变量,但却能覆盖同名全局变量,同时循环体中的局部变量可以覆盖同名全局变量但不能覆盖同名循环变量。由于循环变量和局部变量都能覆盖同名全局变量,所以对于上下文需要用到同名全局变量时要多加注意。我这么说你可能有点迷糊,在代码中不同位置用print(id(t))打印t的id,验证几次便会明白。


  • 1

Reply