2017-03-03 76 views
1

此代码给出了一个“未结合的错误”Python的范围错误

x=3 
def f(): 
    print x 
    x+=3 

这样做的原因(在此查询Python variable scope error讨论)(如在答案给出)是一旦赋值运算符已被使用的“x”成为一个局部变量,因为“X”没有连接到它的值,一个不能被3 增加它可是看看这个代码

x=3 
def f(): 
    print x 
    x=3 

这一次,它似乎并不认为“X”确实有一个值,因此不应该有任何问题,但相同的错误occ URS。

UnboundLocalError: local variable 'x' referenced before assignment 

如果python在阅读'x = 3'语句后已经创建了一个局部变量'x',那么它为什么不打印'x'?

这也是有趣在这里,这段代码不会产生错误

x=3 
def f(): 
    print x 
    x 

的出来是“3”(当f()被调用)

这混淆了我很多,”不是个注意这次也'x'在'f()'内部声明,那么不应该python添加这个'x'到它的局部变量列表?

+0

Python编译您在函数中使用的变量名称列表。这里'x'将被使用,所以它已经为它“保留”了空间,但它未被分配。 –

回答

0

x的范围是f()之外

打印作品,未经分配,因为它假设你是指外部范围的X。如果您稍后尝试分配它,它说:“哎,他一定是说这一个和那不是正确的”

x=3 
def f(): 
    print x 
    print locals() 


f() 
3 
{} 
2

好到你清楚链接的问题指出:

的Python把变量在功能上有所不同,具体取决于您是否从中为您的赋值给它们。

所以在前两个例子中分配给一个变量x - 你无论做了print声明之前或之后 - 所以这意味着有一个局部变量x

在您的最后一个例子,你做不分配给xx不分配,只x =(或x +=等)分配。所以这是一个表达。因此在最后一个例子中没有局部变量x,并且使用了功能范围之外的变量。

+0

所以这意味着如果我不在函数定义中使用赋值运算符,那么该变量将不会像第三种情况下那样是局部变量? –

+1

@AirirhRoy:事实上,python会从具有相同名称的变量的函数作用域中看出来。 –

0

其他人已经告诉我们为什么。除此之外,您可能希望看到这一点:

x = 3 

def f(): 
    global x 
    print(x) 
    x += 3 

比较来local变量,你可以使用global因为某些原因。

+1

嗯,我当然知道,如果我想改变函数外的'x',我应该使用全局,但是我试图知道Python究竟是如何解释代码并通过执行。像这里的问题http://stackoverflow.com/questions/42023636/defining-variable-after-assigning-them-value-in-python-2-7 –