python中关于非局部和全局名称的混淆

python中关于非局部和全局名称的混淆,python,namespaces,Python,Namespaces,所以我读了一些python toturial,偶然发现了一些我不太理解的东西 当我将以下代码写入解释器时: >>> def scope_test(): ... def try_add(): ... nonlocal spam ... spam = "new spam" ... try: ... print(spam) ... except:

所以我读了一些python toturial,偶然发现了一些我不太理解的东西

当我将以下代码写入解释器时:

    >>> 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'