Python变量作用域仅限于函数

4
我不明白为什么这段代码在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。为什么?
5个回答

6
a() 中,你重新声明了本地变量 saber,因此它引用的是一个本地变量而不是在代码开头声明的全局变量。请参阅此文档以获取更多信息。解决方案是在 a() 的开头声明 saber 为全局变量:
def a():
    global saber
    saber = 'ex'
    rider['a'] = 'b' 
    print saber
    print rider

6
在函数 b() 中,saberNone,因为您将其定义为具有 None 值的全局变量,并且在该函数中没有定义同名的局部变量。在函数 a() 中,您使用值为 "ex" 的赋值语句定义了 saber,并在打印该变量时获得了该值。但是,当函数完成时,saber 的值会消失,因为它是本地变量,这就是本地变量的作用。

现在您可能会问为什么在函数 a() 中更改了 rider,而 saber 没有更改。但实际上,rider 并未更改。您在函数 a() 中没有为名称 rider 赋值,因此使用了全局变量 rider。虽然 rider 的内容已更改(添加了新的键/值对),但 rider 本身仍然是您最初定义时的字典对象。这就是为什么在函数 b() 中打印它时,您会得到已更改的字典。两个函数都使用全局变量 rider,因为没有同名的局部变量“隐藏”它。


5
a() 中尝试这个:
global saber
saber = 'ex'

参见这篇帖子,它与类似的问题有关。基本上,如果您没有指定saber是全局的,它将被解释为函数的本地变量。我们不必为rider做同样的事情,因为我们实际上并没有重新分配它,只是修改了它的内容。


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'}

1
和是全局变量,但在函数中你有:

def a():
    saber = 'ex'     # local variable saber, rather than the global one
    rider['a'] = 'b' # global variable rider
    print saber
    print rider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接