Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行python文档示例有don';我不理解python范围和名称空间一章中的内容?_Python - Fatal编程技术网

运行python文档示例有don';我不理解python范围和名称空间一章中的内容?

运行python文档示例有don';我不理解python范围和名称空间一章中的内容?,python,Python,我正在学习python3.6文档,当我查看python作用域和名称空间时,我正在尝试运行此代码,我在作用域测试()调用do_local()打印结果与我的想法不同: def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam" def do_global():

我正在学习python3.6文档,当我查看
python作用域和名称空间时,我正在尝试运行此代码,我在
作用域测试()
调用
do_local()
打印结果与我的想法不同:

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)
我认为调用
do_local()
时应该在
do_local()
范围内查找垃圾邮件,因为
do_local()
范围有
spam
变量,所以:

do_local()
print('After local assignment:', spam) # local spam
除非
do\u local()
没有
spam
变量,然后可以在
scope\u test()中找到
spam

但python解释器打印结果是:

do_local()
print('After local assignment:', spam) # test spam

类似于调用
do_global()
,我认为在这个范围内,bacause
global spam
是全局的,所以:

do_global()
print("After global assignment:", spam) # test spam
但为什么结果是:

do_global()
print("After global assignment:", spam) # nonlocal spam

这是我运行你的程序后得到的结果。让我们看一下

def do_local():
    spam = "local spam"
创建了一个对象垃圾邮件,其作用域仅限于此函数do_local,并在函数的生命周期结束时将其销毁。因此,在本地分配之后,您会看到测试垃圾邮件的输出,它是使用
spam=“test spam”
定义的,它的作用域与函数作用域\u test有关

def do_nonlocal():
    nonlocal spam
    spam = "nonlocal spam"
通过使用nonlocal关键字,您告诉解释器您正在处理的对象不限于函数范围
do\u nonlocal
。因此,解释器在该函数的作用域之外搜索该对象,并在函数
scope\u test
中找到它。然后,它将“非本地垃圾邮件”的值分配给该垃圾邮件对象,该对象属于功能范围
scope\u test

def do_global():
    global spam
    spam = "global spam"
在这里,您实际上创建了一个全局对象垃圾邮件,并将其赋值为 “全球垃圾邮件”。记住:这是你整个计划的全局范围。但是,当您打印垃圾邮件时,python会查找垃圾邮件对象,并仅在函数的作用域中找到它,即在
do\u nonlocal
函数调用中分配了“nonlocal spam”值的垃圾邮件,因此您会将非local spam视为输出

scope_test()
print("In global scope:", spam)
运行范围测试后,最初包含“test spam”值的垃圾邮件对象的范围在函数
scope\u test
结束后仍然存在。因此,当您再次尝试打印垃圾邮件时,会打印出您在
测试范围内调用
do\u global
时创建的全局对象垃圾邮件。
我希望它能消除你心中的困惑

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