为什么此变量的非局部赋值不被视为先前的绑定?

问题描述 投票:0回答:1

spam
nonlocal
函数中被指定为
do_nonlocal()
,根据 Python 文档,这会更改 spam
scope_test 
绑定。但文档还指出,在全局分配之前没有先前对
spam
的绑定。
do_nonlocal()
do_global()
之前调用,这将
spam
的范围扩展到了
scope_test()
。那么,为什么
spam
仅在声明
global
后才被视为绑定,即使文档似乎另有说明?

请注意

local
赋值(默认)并未更改 scope_test 的
spam
绑定。
nonlocal
赋值更改了scope_test对
spam
的绑定,
global
赋值更改了模块级绑定。

您还可以看到在

spam
赋值之前没有对
global
进行任何绑定。

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 scope documentation local
1个回答
0
投票

不太清楚你不明白什么,但是,但这是基本解释。

您有三个不同的变量,全部名称为

spam
。全局变量、
scope_test
内的变量、
do_local
内的变量。你的每一个内在功能都会改变其中的一个不同的功能。

当您在

print(...., spam)
内写入
scope_test
时,您会看到分配给
scope_test
版本的
spam
的最后一个值。当您在全局级别调用相同的打印语句时,您将看到全局值。

© www.soinside.com 2019 - 2024. All rights reserved.