Python范围,字典和变量的区别?

Python scope, dictionary and variables difference?

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

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

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

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

如果我将变量作为全局变量添加,第一个变量就可以工作。

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


看看这篇博文,它和你正在做的相似。特别是亚当的评论。

You don't assign to dictionaryVar, you assign to dictionaryVar['A'].
So it's never being assigned to, so it's implicitly global. If you
were to actually assign to dictionaryVar, you'd get the behavior you
were"expecting".


在第一种情况下,int是不可变的,所以当你做number +=1时,你真的在更新number的点。一般来说,您不希望更改在超出范围的情况下传播。显式地告诉它,python在写时进行复制,并给您一个局部变量号。你比递增那个变量,当函数返回时它就会被丢弃。

在字典的情况下,它是可变的,您获取向上范围引用,然后改变底层对象,这样您的添加就传播出了函数。

在最后一种情况下,您已经明确地告诉python不要将数字设置为局部变量,因此更改将按您的需要传播出去。

相关的python闭包局部变量