And*_*ger 10 python class python-3.x python-nonlocal
我正在尝试对Python 3源代码中的范围进行一些分析,而我仍然坚持非局部语句语句在类定义中的工作方式.
据我了解,类定义在新的命名空间(称为dict)中执行其主体,并将类名绑定到类型(name,bases,dict)的结果.非局部x应该起作用,只要它引用一个绑定在非局部范围内某处的变量.
从这里我希望编译和运行以下代码:
class A:
v = 1
class B:
nonlocal v
v = 2
Run Code Online (Sandbox Code Playgroud)
但这失败了
SyntaxError: no binding for nonlocal 'v' found
Run Code Online (Sandbox Code Playgroud)
而以下代码运行完美
def A():
v = 1
class B:
nonlocal v
v = 2
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释函数定义的闭包和类定义之间的区别吗?
nco*_*lan 10
词法作用域仅适用于函数名称空间,否则在类中定义的方法将能够"看到"类级属性(这是设计的 - 必须将这些属性作为self方法内部的属性进行访问).
导致类级变量被方法引用跳过的相同限制也使nonlocal关键字无法发挥作用.(global确实有效,因为那不依赖于词法范围机制)
Python 处理类和函数定义的方式相当不同。例如,yourA.v不是 A 的变量,而是它的属性。因此,类创建的命名空间不是作用域。nonlocal当你尝试使用它时它不起作用,我并不感到惊讶。
| 归档时间: |
|
| 查看次数: |
3687 次 |
| 最近记录: |