可变全局变量不会隐藏在python函数中,对吧?
请参见下面的代码:可变全局变量不会隐藏在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]
因为你没有设置FOO,你得到的东西在富(富[0]准确地说)。您可以创建一个新变量foo
。在good
中,您可以执行类似foo.set(0, 9)
(将项目0设置为值9)。这是使用一个变量,而不是定义一个新的名称。
变量会先查看其内部范围,然后再查看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'
我知道这种行为,只是对两种情况下的差异感到好奇。我认为@extraneon回答了我的问题。不管怎么说,还是要谢谢你。 – aXqd 2010-05-07 03:19:59
为了简单,蟒蛇先在局部变量和在后全球的。 (用于读取或创建变量)
因此,您可以使用foo变量:没有本地foo变量和全局foo变量=>您采用全局变量并修改它。
糟糕的是,您创建了一个新的(本地)变量,所以全局变量不会被修改。
您可以指定一个变量是全球与全球关键字:
def good2():
global foo
foo = [9, 2, 3]
>“所以,好的,你需要使用foo变量:没有本地foo变量和全局foo变量=>取出全局变量,然后修改它。” 我的问题正是为什么这种行为不会发生在'坏'。这里有什么规则? – aXqd 2010-05-07 03:03:31
如果想好,你要替换的列表foo的内容,那么你可以分配到整个一片列表,如:
def good2():
foo[:] = [9, 2, 3]
就像在那里分配到列表中的一个元素good
,这取代了全部内容。
在bad
中,您绑定了一个名为foo的新列表。
是的,'good2'应该和'good'一样 – aXqd 2010-05-07 02:57:47
我想你是对的。没有设置,没有新的名字。 – aXqd 2010-05-07 03:20:45
我想是这样,但为什么不同的设置和使用之间的逻辑?如果一切顺利,你还必须申报全球foo,是不是更加一致,并防止用户拍摄自己的脚? – liang 2013-09-19 11:50:05