可变全局变量don';不要隐藏在python函数中,对吗?
请参阅以下代码:可变全局变量don';不要隐藏在python函数中,对吗?,python,scope,Python,Scope,请参阅以下代码: 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 "{}": {}'.form
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,所以您在foo中得到了一些东西(确切地说是foo[0])
在
bad
中创建一个新变量foo
。在good
中,您可以执行类似foo.set(0,9)
(将项目0设置为值9)的操作。它使用一个变量,而不是定义一个新名称。因为您没有设置foo,所以您在foo中得到了一些东西(确切地说是foo[0])
在
bad
中创建一个新变量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'
在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'
为了简单起见,python首先查看局部变量,然后查看全局变量。(用于读取或创建变量) 因此,很好地说,我们使用foo变量:没有局部foo变量,而使用全局foo变量=>我们使用全局foo变量并对其进行修改 在bad中,创建一个新的(局部)变量,因此不会修改全局变量 可以使用global关键字指定变量为全局变量:
def good2():
global foo
foo = [9, 2, 3]
为了简单起见,python首先查看局部变量,然后查看全局变量。(用于读取或创建变量) 因此,很好地说,我们使用foo变量:没有局部foo变量,而使用全局foo变量=>我们使用全局foo变量并对其进行修改 在bad中,创建一个新的(局部)变量,因此不会修改全局变量 可以使用global关键字指定变量为全局变量:
def good2():
global foo
foo = [9, 2, 3]
如果您想要替换列表foo的内容,那么您可以将其分配给整个列表的一部分,如下所示:
def good2():
foo[:] = [9, 2, 3]
就像将good
分配给列表中的一个元素一样,这将替换整个内容
在
bad
中,您将一个新的列表绑定到名称foo。如果您想替换列表foo的内容,则可以将其分配给整个列表的一部分,如:
def good2():
foo[:] = [9, 2, 3]
就像将good
分配给列表中的一个元素一样,这将替换整个内容
在
bad
中,您将一个新的列表绑定到名称foo。>“因此,好的情况是,您使用foo变量:没有本地foo变量和全局foo变量=>您使用全局foo变量并对其进行修改。”我的问题是,为什么在“bad”中不会发生这种行为。这里的规则是什么?>“那么,好的情况下,你使用foo变量:没有局部foo变量和全局foo变量=>你使用全局foo变量并对其进行修改。”我的问题是为什么这种行为不会发生在“坏”中。这里的规则是什么?我知道这种行为,只是好奇这两种情况的不同。我想@extraneon回答了我的问题。无论如何,谢谢。我知道这种行为,只是好奇这两种情况的不同。我想@extraneon回答了我的问题。无论如何,谢谢。我想是的,但是为什么设置和使用之间的逻辑不同呢?如果好的话,你还必须声明全局foo,它不是更一致并且防止用户自食其果吗?我想是的,但是为什么设置和使用之间的逻辑不同呢?如果好的话,您还必须声明全局foo,它不是更一致并且防止用户自食其果吗?