首页 > 解决方案 > Python:类内的函数范围

问题描述

让我们考虑下面的代码。

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"]

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

标签: pythonfunctionclassoopscope

解决方案


使用列表推导确定范围需要一些时间来适应。在这种情况下,列表推导中的本地范围会list2 = [name for i in range(2)]暂时阻止类本地范围。见:这个答案


推荐阅读