2010-05-06 14 views
1

请参见下面的代码:可变全局变量不会隐藏在python函数中,对吧?

def good(): 
    foo[0] = 9   # why this foo isn't local variable who hides the global one 

def bad(): 
    foo = [9, 2, 3] # foo is local, who hides the global one 

for func in [good, bad]: 
    foo = [1,2,3] 

    print('Before "{}": {}'.format(func.__name__, foo)) 
    func() 
    print('After "{}": {}'.format(func.__name__, foo)) 

结果如下:

# python3 foo.py 
Before "good": [1, 2, 3] 
After "good": [9, 2, 3] 
Before "bad" : [1, 2, 3] 
After "bad" : [1, 2, 3] 

回答

7

因为你没有设置FOO,你得到的东西富(富[0]准确地说)。您可以创建一个新变量foo。在good中,您可以执行类似foo.set(0, 9)(将项目0设置为值9)。这是使用一个变量,而不是定义一个新的名称。

+0

我想你是对的。没有设置,没有新的名字。 – aXqd 2010-05-07 03:20:45

+0

我想是这样,但为什么不同的设置和使用之间的逻辑?如果一切顺利,你还必须申报全球foo,是不是更加一致,并防止用户拍摄自己的脚? – liang 2013-09-19 11:50:05

0

变量会先查看其内部范围,然后再查看python中的外部范围。例如:

FOO = 'global' 

def printfoo(): 
    print FOO 
# prints 'global' 

def printfoolocal(): 
    FOO = 'local' 
    print FOO 
# prints 'local' 

如果你想修改全局范围的变量,你需要使用global关键字

def modifyfoo(): 
    global FOO 
    FOO = 'modified' 
print FOO 
# prints 'modified' 
+0

我知道这种行为,只是对两种情况下的差异感到好奇。我认为@extraneon回答了我的问题。不管怎么说,还是要谢谢你。 – aXqd 2010-05-07 03:19:59

0

为了简单,蟒蛇先在局部变量和在后全球的。 (用于读取或创建变量)

因此,您可以使用foo变量:没有本地foo变量和全局foo变量=>您采用全局变量并修改它。

糟糕的是,您创建了一个新的(本地)变量,所以全局变量不会被修改。

您可以指定一个变量是全球与全球关键字:

def good2(): 
    global foo 
    foo = [9, 2, 3] 
+0

>“所以,好的,你需要使用foo变量:没有本地foo变量和全局foo变量=>取出全局变量,然后修改它。” 我的问题正是为什么这种行为不会发生在'坏'。这里有什么规则? – aXqd 2010-05-07 03:03:31

0

如果想好,你要替换的列表foo的内容,那么你可以分配到整个一片列表,如:

def good2(): 
    foo[:] = [9, 2, 3] 

就像在那里分配到列表中的一个元素good,这取代了全部内容。

bad中,您绑定了一个名为foo的列表。

+0

是的,'good2'应该和'good'一样 – aXqd 2010-05-07 02:57:47