Python: class 内的函数作用域

Python: Function scope inside a class

让我们考虑下面的代码。

name = "John"

class MyClass:
    name = "Tom"
    list_1 = [name] * 2
    list_2 = [name for i in range(2)]

乍一看,人们可能认为 list_1list_2 两者具有相同的 内容:["Tom", "Tom"],但事实并非如此。 list_1 评估为 ["Tom", "Tom"],而 list_2 的计算结果为 ["John", "John"]

我读到当一个函数嵌套在 class 中时,Python 将使用定义在模块范围内而不是 class 范围内的变量。 list_1 不是函数,因此它使用 class 作用域中的 name,而 list_2 是函数,因此使用模块作用域中的 name .我知道这就是它的工作原理,但它似乎违反直觉。我不明白原因。

使用列表推导来确定范围需要一些时间来适应。在这种情况下,列表推导 list2 = [name for i in range(2)] 中的局部作用域会暂时阻塞 class 局部作用域。参见:this answer.