关于范围:全球和地方分配

时间:2017-09-21 05:57:46

标签: python

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()一起工作,这会导致“非本地垃圾邮件”。但事实并非如此。

为什么?

1 个答案:

答案 0 :(得分:2)

这是一个全局变量示例(来自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

正如您在此示例中所看到的,全局表示脚本中任何位置都可用的变量。如果您在函数中定义或更改全局变量,则可以在具有全局关键字的其他函数中使用它。

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

globvar = 0

无论如何它都可以作为全局变量。因此,当您使用全局关键字时,它可以在脚本的任何范围内使用。

来自here

非本地定义

  

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

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

如果您不使用全局非本地关键字,那么在函数中定义“垃圾邮件”,它只是本地变量当函数结束时删除。

修改

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

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)