【问题标题】:Regarding Scope : Global and Local Assignment关于范围:全局和本地分配
【发布时间】:2017-09-21 05:57:45
【问题描述】:
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)

您好,我正在处理 python 类,并面临官方文档中的上述示例。

输出:

本地分配后:测试垃圾邮件

非本地分配后:非本地垃圾邮件

全局分配后:非本地垃圾邮件

在全球范围内:全球垃圾邮件

do_local 之后的第一次打印结果仍然打印“测试垃圾邮件”,但无法弄清楚为什么第二次打印结果为“非本地垃圾邮件”。

有什么区别?

我的推断是,如果我 do_local() 则它运行 do_local() 并将垃圾邮件变量更改为“本地垃圾邮件”,并且它可能必须与导致“非本地垃圾邮件”的 do_nonlocal() 相同。但事实并非如此。

为什么?

【问题讨论】:

  • 嗯,第二种情况是nonlocal
  • @DavisHerring 是的

标签: python


【解决方案1】:

这是一个全局变量示例(来自here):

globvar = 0

def set_globvar_to_one():
    global globvar    # Needed to modify global copy of globvar
    globvar = 1

def print_globvar():
    print(globvar)     # No need for global declaration to read value of globvar

set_globvar_to_one()
print_globvar()       # Prints 1

正如您在此示例中所见,global 表示可在脚本中的任何位置使用的变量。如果您在函数中定义或更改全局变量,您可以在另一个函数中使用 global 关键字。

即使您可以删除示例中的第一个定义行:

globvar = 0

它仍然可以作为 global 变量使用。因此,当您使用 global 关键字时,它可以在脚本的任何范围内使用。

非本地定义来自here

Python 3 引入了 nonlocal 关键字,允许您分配给 外部但非全局范围内的变量。

这意味着,当您使用 nonlocal 关键字时,它是可用的外部范围。在这种情况下,do_nonlocal() 函数中的“非本地垃圾邮件”也可以在 scope_test() 函数中使用,但不能再多一个外部作用域。

如果不使用globalnonlocal关键字,那么在函数中定义“spam”,它只是一个local变量函数结束后删除。

编辑

这不是相同的代码,但会打印相同的结果。为了更好地理解,情况是这样的:

spam_1 = ""

def scope_test():
    def do_local():
        spam_3 = "local spam"

    def do_nonlocal():
        nonlocal spam_2
        spam_2 = "nonlocal spam"

    def do_global():
        global spam_1
        spam_1 = "global spam"

    spam_2 = "test spam"
    do_local()
    print("After local assignment:", spam_2)
    do_nonlocal()
    print("After nonlocal assignment:", spam_2)
    do_global()
    print("After global assignment:", spam_2)

scope_test()
print("In global scope:", spam_1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2021-03-05
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2011-12-31
    • 2012-08-09
    相关资源
    最近更新 更多