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_1
和 list_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.
让我们考虑下面的代码。
name = "John"
class MyClass:
name = "Tom"
list_1 = [name] * 2
list_2 = [name for i in range(2)]
乍一看,人们可能认为 list_1
和 list_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.