以下是代码片段,'#'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
答案 0 :(得分:2)
要理解这个问题,您需要了解Python的范围规则
范围定义块中名称的可见性。如果是当地的 变量在块中定义,其范围包括该块。如果 定义发生在功能块中,范围扩展到任何块 包含在定义的内容中,除非包含的块引入 名称的不同绑定。
因此,在函数bar
中,当您第一次将数字3
分配给变量a
时,它在函数范围中引入了一个新的局部变量,其生命周期一直延续到当前范围的结尾,即功能体。
现在,您已使用global
关键字访问全局变量a
并将其添加到当前本地范围。这是相互矛盾的,因为在同一范围内不存在具有相同命名的两个变量。
理想情况下,您需要将以前的本地声明重命名为其他名称。
注意您是否有任何特定用例需要本地和全局的特定混合使用?你能通过重命名局部变量来解决它吗?