6

Python范围 我有同样的问题,但略有不同。

number = 0
def incrementNumber():
    number += 1

上面的这个不起作用,但下面的这个不起作用,为什么?两者都在功能范围之外。

number = {'num':0}
def incrementNumber():
    number['num'] += 1

如果我将变量添加为全局变量,第一个有效

number = 0
def incrementNumber():
    global number
    number += 1
4

2 回答 2

4

查看此博客文章,它与您正在做的类似。特别是亚当的评论。

您不分配给dictionaryVar,而是分配给dictionaryVar['A']。所以它永远不会被分配,所以它是隐式的全局的。如果您要实际分配给 dictionaryVar,您会得到您“期望”的行为。

于 2012-10-25T02:12:56.207 回答
0

在第一种情况下int是不可变的,所以当你这样做时,你number +=1真的在​​更新 wherenumber点。通常,您不希望更改在没有明确告知的情况下向上传播,python 会执行写时复制并为您提供局部变量编号。您比增加该变量并在函数返回时将其丢弃

对于可变的字典,您正在获取向上范围的引用,然后改变底层对象,因此您的添加会传播到函数之外。

在最后一种情况下,您已明确告诉 python不要将 number 设为局部变量,因此更改会根据需要传播出去。

相关的python闭包局部变量

于 2012-10-25T03:30:41.817 回答