为什么在全局范围内打印变量有效,但修改它不起作用?

时间:2015-07-30 08:09:53

标签: python python-2.7

x = 1
def fn():
    print x
fn()

打印“1”:

x = 1
def fn():
    x += 1
    print x
fn()

这会引发“UnboundLocalError:在赋值之前引用的局部变量'x'”

这里发生了什么?

4 个答案:

答案 0 :(得分:4)

在Python中,分配给变量也是一个隐式本地声明,在字节码编译期间解析。所以

x += 1

将创建一个局部变量x并编译为此字节代码:

0 LOAD_FAST                0 (x)
3 LOAD_CONST               1 (1)
6 INPLACE_ADD
7 STORE_FAST               0 (x)

命令LOAD_FAST将尝试加载尚未定义的局部变量x,以及它失败的原因。

但是,如果您明确将x定义为global,则会改为使用LOAD_GLOBAL / STORE_GLOBAL

在第一个函数中print的情况下,编译器假定因为在函数体中没有声明(赋值)局部变量,所以你应该指一个全局变量。

答案 1 :(得分:2)

在函数内的任何位置分配名称的行为仅使该名称为本地名称。

答案 2 :(得分:1)

您正在使用local变量,一个不同的绑定,而不是全局

  

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

答案 3 :(得分:0)

因为你必须在函数中添加global x

def fn():
    global x
    x += 1
    print x

这告诉解释器您打算修改全局变量。 This is not necessary for certain objects类似可变序列(例如list)。