运行python文档示例有don';我不理解python范围和名称空间一章中的内容?
我正在学习python3.6文档,当我查看运行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():
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()
,我认为在这个范围内,bacauseglobal 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)