python变量范围只有函数

时间:2015-03-05 02:28:49

标签: python

我不明白为什么此代码在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被打印。为什么呢?

5 个答案:

答案 0 :(得分:6)

a()中,您在本地重新声明saber,因此它引用了一个局部变量,而不是您在代码开头声明的全局变量。有关详细信息,请参阅this documentation。解决方案是在saber

的开头声明a()全局
def a():
    global saber
    saber = 'ex'
    rider['a'] = 'b' 
    print saber
    print rider

答案 1 :(得分:6)

saberNone中为b(),因为您已将其定义为值为None的全局变量,并且尚未定义同名的本地变量那个功能。在a()中,您定义saber的值为"ex",当您打印该变量时,就是您所拥有的内容。但是当函数完成时,saber的值就消失了,因为它是函数的局部值,而且是局部变量的作用。

现在,当rider没有a()时,您可能会问saber rider为何被更改。但事实上,rider没有改变。您未在a()中分配名称rider,因此使用了全局变量riderrider内容已更改(您添加了新的键/值对),但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