2016-02-08 117 views
0

如果这个工程合并全局和局部范围

x=5 
def main(): 
    for globe in locals(): 
     globals().update(locals()[globe]) 
    print x 
main() 

那么为什么不呢?

x=5 
def main(): 
    for globe in locals(): 
     globals().update(locals()[globe]) 
    x+=1 
    print x 
main() 

后者语句中的错误声称,x被赋值之前被引用,但它工作在第一个例子...

回答

0

你不能没有明确这样做分配Python中的全局变量。通过编写x+=1您正在为x赋值并隐式声明x为局部变量。但它没有定义,因此你得到一个错误。

循环没有实际效果,因为locals字典为空。

如果你想在Python中使用全局变量(你不应该这样做,但那是另一回事),你应该使用global关键字。

1

在当你将一个变量声明自动发生蟒蛇。 因此,当您在函数内部为x赋值时,python认为这是一个新的局部变量,影响全局x

,如果你想一个值分配给全球x你可以这样做:

x=5 
def main(): 
    global x 

    x += 1 
    print x 
main() 
0

后面添加1和2的两个功能,你可以找到本地名称(语法在Python 2略有不同):

In [7]: main1.__code__.co_varnames 
Out[7]: ('globe',) 

In [8]: main2.__code__.co_varnames 
Out[8]: ('globe', 'x') 

所以x有不同的状态。在第二种情况下,本地x掩盖全局,因此x = x + 1会导致错误,因为尚未定义。

docs

如果名称是在块的约束,它是块的局部变量,除非声明为外地或全球(...)如果一个变量中使用。一个代码块,但没有在那里定义,它是一个自由变量。