我不明白为什么这段代码打印None在b():
# 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()
Run Code Online (Sandbox Code Playgroud)
当b()被调用时,印刷saber在结果中None被打印.为什么?
在a(),您在saber本地重新声明,因此它引用了一个局部变量,而不是您在代码开头声明的全局变量.有关更多信息,请参阅此文档.解决方案是saber在开始时声明全局a():
def a():
global saber
saber = 'ex'
rider['a'] = 'b'
print saber
print rider
Run Code Online (Sandbox Code Playgroud)
saber是None的b(),因为你已经将它定义为与值全局变量None并没有定义在该函数同名的局部变量.在a()您定义saber的值"ex"和打印该变量时,这就是您所获得的.但是saber当函数完成时,该值消失了,因为它是函数的局部值,而这就是局部变量的作用.
现在你可能会问为什么rider在没有的a()时候改变了saber.但事实上,rider并没有改变.你没有分配到的名字rider中a(),所以全局变量rider使用.所述内容的rider被改变(你添加了新的键/值对),但rider本身仍是相同的字典对象在首次定义它是.这就是为什么当你打印它时b()你得到改变的字典.这两个函数都使用全局变量,rider因为没有同名的局部变量"隐藏"它.
试试这个a():
global saber
saber = 'ex'
Run Code Online (Sandbox Code Playgroud)
有关类似问题,请参阅此帖子.基本上,如果您没有指定saber是全局的,它将被解释为函数的本地.我们不必这样做rider因为我们实际上没有重新分配它,只修改其内容.