2024-06-01 06:52:36 发布
网友
我不明白为什么这段代码在b()中打印None:
b()
None
# coding: utf-8 saber = None rider = dict() def a(): saber = 'ex' rider['a'] = 'b' print saber print rider def b(): print saber print rider if __name__ == '__main__': a() b()
调用b()时,打印saber会导致打印None。为什么?你知道吗
saber
在a()中,您在本地重新声明saber,因此它引用的是一个局部变量,而不是您在代码开头声明的全局变量。有关详细信息,请参见this documentation。解决方案是在saber开头声明a()全局:
a()
def a(): global saber saber = 'ex' rider['a'] = 'b' print saber print rider
saber在b()中是None,因为您已将其定义为值为None的全局变量,并且未在该函数中定义同名的局部变量。在a()中,您使用"ex"值定义了saber,当您打印该变量时,得到的就是这个值。但是saber的值在函数完成时消失了,因为它是函数的局部变量,这就是局部变量的作用。你知道吗
"ex"
现在你可能会问为什么rider在a()中发生了变化而saber却没有。但事实上,rider并没有改变。您没有在a()中指定名称rider,因此使用了全局变量rider。rider的内容已更改(您添加了一个新的键/值对),但rider本身仍然是第一次定义它时的dictionary对象。这就是为什么当你在b()中打印它时,你会得到更改过的字典。这两个函数都使用全局变量rider,因为没有同名的局部变量“隐藏”它。你知道吗
rider
在a()中试试这个:
global saber saber = 'ex'
类似的问题请参见this post。基本上,如果您没有指定saber是全局的,它将被解释为函数的局部。我们不必对rider做同样的操作,因为我们实际上并没有重新分配它,只是修改它的内容。你知道吗
在
a()
中,您在本地重新声明saber
,因此它引用的是一个局部变量,而不是您在代码开头声明的全局变量。有关详细信息,请参见this documentation。解决方案是在saber
开头声明a()
全局:saber
在b()
中是None
,因为您已将其定义为值为None
的全局变量,并且未在该函数中定义同名的局部变量。在a()
中,您使用"ex"
值定义了saber
,当您打印该变量时,得到的就是这个值。但是saber
的值在函数完成时消失了,因为它是函数的局部变量,这就是局部变量的作用。你知道吗现在你可能会问为什么
rider
在a()
中发生了变化而saber
却没有。但事实上,rider
并没有改变。您没有在a()
中指定名称rider
,因此使用了全局变量rider
。rider
的内容已更改(您添加了一个新的键/值对),但rider
本身仍然是第一次定义它时的dictionary对象。这就是为什么当你在b()
中打印它时,你会得到更改过的字典。这两个函数都使用全局变量rider
,因为没有同名的局部变量“隐藏”它。你知道吗在
a()
中试试这个:类似的问题请参见this post。基本上,如果您没有指定
saber
是全局的,它将被解释为函数的局部。我们不必对rider
做同样的操作,因为我们实际上并没有重新分配它,只是修改它的内容。你知道吗相关问题 更多 >
编程相关推荐