可变全局变量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,它不是更一致并且防止用户自食其果吗?