python - 关于python中非本地和全局名称的混淆

标签 python namespaces

所以我一直在读一些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
但是当我运行这段代码时:
>>> 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'
它运行良好。
对此有何解释?

最佳答案

来自文档:https://docs.python.org/3/reference/simple_stmts.html#the-nonlocal-statement

Names listed in a nonlocal statement, unlike those listed in a global statement, must refer to pre-existing bindings in an enclosing scope (the scope in which a new binding should be created cannot be determined unambiguously).


(强调我的)。强调后的陈述告诉你为什么应该这样。
global如果变量不存在,那么它可以在全局范围内创建。所以,在你的例子中 global python 愉快地创建 spam在全局范围内。
nonlocal , 如果变量不存在,应该在哪个范围内创建?最近的封闭范围和全局范围之间可能有许多范围。而不是猜测,nonlocal坚持变量已经存在。在您的示例中使用 nonlocal ,没有 spam封闭范围和全局范围之间的任何地方,所以你会得到错误。

关于python - 关于python中非本地和全局名称的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66822175/

相关文章:

python - 如何在 python 中对 stdout 进行原子写入?

c# - 向 XMl 添加节点

python - 如何将逆向转置应用到 numpy 数组

Python 的 in (__contains__) 运算符返回一个 boolean 值,其值既不是 True 也不是 False

r - 使用 dplyr : object ‘data_frame’ is not exported by 'namespace:vctrs' 时出错

python - 如何从 Seaborn 的计数图图形中删除标签名称?

http - 用于Web HTTP/HTTPS的基于永久ID的超链接方案,有多少种方法?

flash - 在 Flash Builder 中将 Namespace 降低到 2.6

python - 将图像作为二维数组导入 python

python - 如何显示电话簿的详细 View ?