【发布时间】:2019-09-13 18:21:42
【问题描述】:
我正在阅读 python 参考资料name resolution,内容为
类定义是可以使用和定义名称的可执行语句。这些引用遵循名称解析的正常规则,但在全局命名空间中查找未绑定的局部变量。
基于此,我期望以下代码
x = 10
def f():
x = 5
class Test:
y = x
return Test
print(f().y)
打印10,但是它打印5。这是参考中的错误,还是我误解了什么?
【问题讨论】:
-
你在函数内部将
Test.y设置为x,其中x是5。f()返回Test,所以f().y是Test.y,也就是5。为什么你期待 10 个吗? -
@khelwood:因为它说在类定义块中未绑定的名称在全局中查找,这与规则相反。这里发生的事情似乎遵循标准规则
-
它说“在全局命名空间中查找未绑定的局部变量”。
x不是未绑定的局部变量。 -
@khelwood:按照我的理解,在类定义的上下文中,它的意思是 unbound,而不是函数。另外,我看不出当前的行为是对标准规则的期望
-
class语句不能有自己的局部变量,因为class语句没有建立新的范围。这是一个奇怪的伪作用域,y会暂时隐藏任何“外部”y,直到class语句完成,但在任何方法的定义中都会被忽略。
标签: python