python - Python 中 global 关键字的作用

标签 python

我一直在关注 Python 文档中的教程,并且发现了有关使用 globalnonlocal 关键字的代码。我已经通读了代码,但我不太明白为什么有些代码会这样做。这是代码:

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)

打印输出:

After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

do_global() 调用之后,为什么 spam 会打印出 nonlocal spam?它不应该打印出 global spam 吗?

谢谢!

最佳答案

do_global 调用分配一个global 变量(在所有函数之外的范围内定义的变量)。 scope_test 函数内的 print 函数仍然引用该函数本地范围内的 spam

因此,由于 global 关键字使值 "global spam" 分配给垃圾邮件的全局范围,因此更改不会应用于本地范围,并且仍然打印未更改的本地范围。

Python 检查这一点的具体机制是在最局部范围内搜索变量,最终在全局范围内结束。这就是为什么总是在同名的全局变量之前引用局部变量。

关于python - Python 中 global 关键字的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31898055/

相关文章:

python - 使用 pyodbc 在 SQL Server 中创建模式

python - 打字错误 : Failed in nopython mode pipeline (step: nopython frontend)

python - 获取<生成器对象<genexpr>

python - 在 Windows Azure 上配置 Python 3.4 和 Django

python - 如何在Python中编辑FLAC文件的长度?

python - 为什么字符串乘法的字节码不同?

python - pandas.plot 参数 c vs s

python - 我的这段网页抓取代码做错了什么?

python - 如果另一列数据在列表中, Pandas 会更改一列数据

python - 将 Django UserCreationForm 的密码验证错误从密码 2 移至密码 1