我不明白为什么此代码在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()
调用b()
后,打印saber
会导致None
被打印。为什么呢?
答案 0 :(得分:6)
在a()
中,您在本地重新声明saber
,因此它引用了一个局部变量,而不是您在代码开头声明的全局变量。有关详细信息,请参阅this documentation。解决方案是在saber
:
a()
全局
def a():
global saber
saber = 'ex'
rider['a'] = 'b'
print saber
print rider
答案 1 :(得分:6)
saber
在None
中为b()
,因为您已将其定义为值为None
的全局变量,并且尚未定义同名的本地变量那个功能。在a()
中,您定义saber
的值为"ex"
,当您打印该变量时,就是您所拥有的内容。但是当函数完成时,saber
的值就消失了,因为它是函数的局部值,而且是局部变量的作用。
现在,当rider
没有a()
时,您可能会问saber
rider
为何被更改。但事实上,rider
没有改变。您未在a()
中分配名称rider
,因此使用了全局变量rider
。 rider
的内容已更改(您添加了新的键/值对),但b()
本身仍然是您第一次定义它时的字典对象。这就是为什么当你在rider
打印它时,你会得到更改的字典。这两个函数都使用全局变量{{1}},因为没有相同名称的局部变量"隐藏"它
答案 2 :(得分:5)
在a()
:
global saber
saber = 'ex'
有关类似问题,请参阅this post。基本上,如果您没有指定saber
是全局的,那么它将被解释为函数的本地。我们不必对rider
执行相同操作,因为我们实际上并未对其进行重新分配,只是修改其内容。
答案 3 :(得分:3)
在代码中查看我的评论。
#!/usr/bin/python
# -*- coding: utf-8 -*-
saber = None
rider = dict()
# use id() to get memory address of this object
print id(saber)
print id(rider)
def a():
saber = 'ex'
rider['a'] = 'b'
print id(saber)
# as you can see here, you have created a new object inside function a which replace the global variable
print saber
print id(rider)
# you are using the same object from global
print rider
def b():
print id(saber)
# you are using the global variable here
print saber
print id(rider)
# you are using the global variable here
print rider
if __name__ == '__main__':
a()
b()
输出:
35731224
506032968
35662984
ex
35731224
{'a': 'b'}
506032968
None
35731224
{'a': 'b'}
答案 4 :(得分:1)
佩剑和骑手是全球性的,但在()中你有:
def a():
saber = 'ex' # local variable saber, rather than the global one
rider['a'] = 'b' # global variable rider
print saber
print rider