Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么在全局范围内查找未初始化的类变量而不是在封闭范围内?_Python_Function_Class_Variables - Fatal编程技术网

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开发线程的链接已经死了(尽管它可能引用了上的一个线程)。