使用同名的本地和全局变量了解输出

时间:2015-10-29 07:16:05

标签: python global-variables

以下是代码片段,'#'post print语句是打印的输出。我期待最后一次'打印a'打印1而不是3.在bar()中发生了什么变化。

我还收到了语法警告: - SyntaxWarning: name 'a' is assigned to before global declaration

a = 1
def foo():
    a = 2
    print a #2

def bar():
    a = 3
    print a #3
    global a
    print a #3

foo()
print a #1
bar()
print a #3

1 个答案:

答案 0 :(得分:2)

要理解这个问题,您需要了解Python的范围规则

Execution model

  

范围定义块中名称的可见性。如果是当地的   变量在块中定义,其范围包括该块。如果   定义发生在功能块中,范围扩展到任何块   包含在定义的内容中,除非包含的块引入   名称的不同绑定。

因此,在函数bar中,当您第一次将数字3分配给变量a时,它在函数范围中引入了一个新的局部变量,其生命周期一直延续到当前范围的结尾,即功能体。

现在,您已使用global关键字访问全局变量a并将其添加到当前本地范围。这是相互矛盾的,因为在同一范围内不存在具有相同命名的两个变量。

理想情况下,您需要将以前的本地声明重命名为其他名称。

注意您是否有任何特定用例需要本地和全局的特定混合使用?你能通过重命名局部变量来解决它吗?