for循环中的Python变量范围

时间:2013-11-24 03:09:26

标签: python variables for-loop scope

这是一个非常简单的问题,但我不知道为什么python会这样做。对于下面的循环,if head != None...正在创建一个局部变量,以致head += 1不会修改for head in myHeap.array中的头部。在头+ + 1之后添加一个打印(头)产生我想要的结果,但if语句之外的头保持不变。

    for head in myHeap.array:
        if head != None and count % int(grow) == 0:
            head += 1

所以输入myHeap.array = [2,2,2,1]在迭代结束时输出相同的列表,当预期为[3,3,3,2]时。我还验证了if语句满足条件,解释器使用head += 1

2 个答案:

答案 0 :(得分:5)

您需要访问myHeap.array列表的元素才能修改它们。像这样:

class myHeap(object):
    pass

myHeap.array = [2, 2, 2, 1]

for n, head in enumerate(myHeap.array):
    if head != None:
        myHeap.array[n] = head + 1

print myHeap.array

输出:

[3, 3, 3, 2]

答案 1 :(得分:1)

运行此命令并仔细查看生成的ID。

listt = [2, 3]

for i in listt:
    print(id(i))
    i += 1
    print(id(i))
    print()

print(listt)
print()

for i in range(len(listt)):
    print(id(listt[i]))
    listt[i] += 1
    print(id(listt[i]))
    print()

print(listt)

您的代码中发生的事情是临时变量中的对象引用已更新,因此它不再包含对列表中对象的引用。因此,您没有在列表中看到更改。您需要更新列表元素中的引用。为此,您需要直接访问这些变量,即通过下标。