python变量范围只有函数

E_J*_*ovi 4 python

我不明白为什么这段代码打印Noneb():

# 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被打印.为什么?

mic*_*lak 6

a(),您在saber本地重新声明,因此它引用了一个局部变量,而不是您在代码开头声明的全局变量.有关更多信息,请参阅此文档.解决方案是saber在开始时声明全局a():

def a():
    global saber
    saber = 'ex'
    rider['a'] = 'b' 
    print saber
    print rider
Run Code Online (Sandbox Code Playgroud)


kin*_*all 6

saberNoneb(),因为你已经将它定义为与值全局变量None并没有定义在该函数同名的局部变量.在a()您定义saber的值"ex"和打印该变量时,这就是您所获得的.但是saber当函数完成时,该值消失了,因为它是函数的局部值,而这就是局部变量的作用.

现在你可能会问为什么rider在没有的a()时候改变了saber.但事实上,rider并没有改变.你没有分配到的名字ridera(),所以全局变量rider使用.所述内容rider被改变(你添加了新的键/值对),但rider本身仍是相同的字典对象在首次定义它是.这就是为什么当你打印它时b()你得到改变的字典.这两个函数都使用全局变量,rider因为没有同名的局部变量"隐藏"它.


Ósc*_*pez 5

试试这个a():

global saber
saber = 'ex'
Run Code Online (Sandbox Code Playgroud)

有关类似问题,请参阅此帖子.基本上,如果您没有指定saber是全局的,它将被解释为函数的本地.我们不必这样做rider因为我们实际上没有重新分配它,只修改其内容.