Python 中诡异的变量作用域

Python 中的作用域有四个部分:

这四个部分并没有任何奇怪,很多语言都有类似的作用域分类,但是 Python 中的具体机制有一点十分新奇:不能直接修改外围作用域的变量。

最最好玩的点在于,这里的「不能直接修改」,很微妙。

在我现有的认知里,这里的「不能直接修改」指的并不是不能直接修改,因为可变变量看上去是可以直接修改的,但不可变变量不行。

为什么呢?这里的「修改」指的是映射表意义上的修改,而不是对象意义上的。

在 Python 中,基于对象直接修改和重建映射表关系很容易混淆。

也正是因为容易混淆,所以在 Python 中提供了专门的关键词 global 以及 nonlocal(3.0 以后)用于声明默认映射表关系向上提升到某一个作用域。

记住:默认情况下,Python 中的新建映射表关系都是在默认的作用域中,比如函数和类中的就是 局域 。


不知是该恭喜,还是该怎样,总之阅读到该文的,你是第 人。每一次刷新,都是不同的自己。