python中关于非局部和全局名称的混淆
所以我读了一些python toturial,偶然发现了一些我不太理解的东西 当我将以下代码写入解释器时:python中关于非局部和全局名称的混淆,python,namespaces,Python,Namespaces,所以我读了一些python toturial,偶然发现了一些我不太理解的东西 当我将以下代码写入解释器时: >>> def scope_test(): ... def try_add(): ... nonlocal spam ... spam = "new spam" ... try: ... print(spam) ... except:
>>> def scope_test():
... def try_add():
... nonlocal spam
... spam = "new spam"
... try:
... print(spam)
... except:
... print("exception caught")
... try_add()
... print(spam)
我得到以下错误:
File "<stdin>", line 3
SyntaxError: no binding for nonlocal 'spam' found
它运行良好
对此有何解释?来自文档:
非局部语句中列出的名称与全局语句中列出的名称不同,必须引用封闭范围中的预先存在的绑定(创建新绑定的范围无法明确确定)
(我的重点)。强调之后的陈述告诉你为什么会这样
使用global
时,如果变量不存在,则可以在全局范围内创建该变量。因此,在您使用global
python的示例中,python在全局范围内愉快地创建spam
对于非局部变量,如果变量不存在,应在哪个范围内创建?在最近的封闭作用域和全局作用域之间可能有许多作用域。而不是猜测,
非局部
坚持变量已经存在。在您使用非本地
的示例中,封闭范围和全局范围之间没有垃圾邮件
,因此您会得到错误。Ty非常:)
>>> def scope_test():
... def try_add():
... global spam
... spam = "new spam"
... try:
... print(spam)
... except:
... print("exception caught")
... try_add()
...
>>> scope_test()
exception caught
>>> spam
'new spam'