Python 为什么在全局范围内查找未初始化的类变量而不是在封闭范围内?
这不是一个问题,我需要一个编码项目,但我的一个朋友寄给我这个。 问题是:这里打印的是什么?为什么Python 为什么在全局范围内查找未初始化的类变量而不是在封闭范围内?,python,function,class,variables,Python,Function,Class,Variables,这不是一个问题,我需要一个编码项目,但我的一个朋友寄给我这个。 问题是:这里打印的是什么?为什么 x = 0 y = 0 def f(): x = 1 y = 1 class A: print(x,y) x = 2 f() 输出: 0 1 1 1 我的第一直觉告诉我应该是“11”,但我错了。我拨弄了一下代码,发现如果我删除了“x=2”,我会是正确的。但是为什么呢 而且,当我将变量设置为全局变量时,它也起了作用。像这样: x = 0 y
x = 0
y = 0
def f():
x = 1
y = 1
class A:
print(x,y)
x = 2
f()
输出:
0 1
1 1
我的第一直觉告诉我应该是“11”,但我错了。我拨弄了一下代码,发现如果我删除了“x=2”,我会是正确的。但是为什么呢
而且,当我将变量设置为全局变量时,它也起了作用。像这样:
x = 0
y = 0
def f():
global x
global y
x = 1
y = 1
class A:
print(x,y)
x = 2
f()
输出:
0 1
1 1
我不是在寻找解决问题的其他方法,只是更好地了解这里正在发生的事情
提前感谢这一点记录在以下内容的最后一段中: exec()和eval()的类定义块和参数是特殊的 在名称解析的上下文中。类定义是一个可执行文件 可以使用和定义名称的语句。这些参考文献遵循 名称解析的常规规则,但未绑定的本地 在全局命名空间中查找变量。(强调矿山) 因此,
y
按预期在定义它的最近的封闭范围内进行查找(函数f
,其中它获得值1)
另一方面,x=2
导致x被认为是局部的,并且由于它尚未在print(x,y)
中定义,异常导致在全局名称空间中查找它(在那里它得到值0),而不是像正常函数中未绑定的局部变量所预期的那样,导致namererror
我一直想知道为什么会有这样的特殊规则,多亏@orlp在这个问题下的评论,我才找到了答案 问题中的代码似乎来自,并且是最近发布的 当有人问到原因时: 与Python 2.1的向后兼容性
所以现在我们知道了…Ugh,比我快,+1.@orlp谢谢,特别是Guido的推文链接解释了这个规则的原因!这是Guido van Rossum写的,他从中获得了它。很遗憾,博客文章中指向原始python开发线程的链接已经死了(尽管它可能引用了上的一个线程)。