仅带函数的python变量作用域

2024-06-01 06:52:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白为什么这段代码在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。为什么?你知道吗


Tags: 代码namenoneifmaindefsaberdict
3条回答

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

def a():
    global saber
    saber = 'ex'
    rider['a'] = 'b' 
    print saber
    print rider

saberb()中是None,因为您已将其定义为值为None的全局变量,并且未在该函数中定义同名的局部变量。在a()中,您使用"ex"值定义了saber,当您打印该变量时,得到的就是这个值。但是saber的值在函数完成时消失了,因为它是函数的局部变量,这就是局部变量的作用。你知道吗

现在你可能会问为什么ridera()中发生了变化而saber却没有。但事实上,rider并没有改变。您没有在a()中指定名称rider,因此使用了全局变量riderrider内容已更改(您添加了一个新的键/值对),但rider本身仍然是第一次定义它时的dictionary对象。这就是为什么当你在b()中打印它时,你会得到更改过的字典。这两个函数都使用全局变量rider,因为没有同名的局部变量“隐藏”它。你知道吗

a()中试试这个:

global saber
saber = 'ex'

类似的问题请参见this post。基本上,如果您没有指定saber是全局的,它将被解释为函数的局部。我们不必对rider做同样的操作,因为我们实际上并没有重新分配它,只是修改它的内容。你知道吗

相关问题 更多 >