我搜索了这个,但找不到任何东西。在Python documentation 9.2.1中,使用函数scope_test()
给出了一个示例。
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
scope_test()
print("In global scope:", spam)
当我将其更改为class
并运行它时,我得到:
SyntaxError: no binding for nonlocal 'spam' found
我认为'nonlocal'
对于类中的方法不起作用,但它只能找到函数内部的函数。我在网上找到的所有答案都是针对功能而不是课程。
答案 0 :(得分:1)
nonlocal
当然适用于类中的方法,你只需要将函数嵌套在一个方法中(我在这里使用static方法):
class Foo:
@staticmethod
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
Foo.scope_test()
print("In global scope:", spam)
使scope_test
成为一个类并不会引入nonlocal
工作所需的嵌套。你还需要嵌套。
答案 1 :(得分:1)
在该示例中显示的词法作用域仅适用于函数名称空间。想象一下,如果这是在一个类中工作 - 那么所有类方法都能够直接访问类属性,而不是通过self
参数或类名实际工作。
换句话说,类的命名空间不会为类中的方法引入封闭范围,这也会阻止nonlocal
查找类体级绑定。