Python 奇怪的命名空间行为

Python 奇怪的命名空间行为,python,Python,尝试运行以下代码时: i = 0 def truc(): print (i) if (False): i = 0 truc() 它会产生一个UnboundLocalError,但是 i = 0 def truc(): print (i) #if (False): i = 0 truc() 没有 这是通缉犯的行为吗 有没有办法在不创建新变量的情况下修改变量的值?我可以使用一个元素的dict。它可以工作,但看起来很难看: i = {0 : 0} def truc(

尝试运行以下代码时:

i = 0
def truc():
    print (i)
    if (False): i = 0
truc()
它会产生一个UnboundLocalError,但是

i = 0
def truc():
    print (i)
    #if (False): i = 0
truc()
没有

这是通缉犯的行为吗

有没有办法在不创建新变量的情况下修改变量的值?我可以使用一个元素的dict。它可以工作,但看起来很难看:

i = {0 : 0}
def truc():
    print (i[0])
    if (False): i[0] = 0
truc()
这不是更好的解决办法吗

i = 0
def truc():
    global i
    print (i)
    if (False): i = 0
truc()
要引用函数的外部范围变量,
i
应声明为全局变量。

只需添加

global i
在方法
truc()
的开头,声明
i
是全局变量

def truc():
    global i
    if (False):
        i = 0

查看此项以获取更多信息

您必须将
全局i
添加到函数中

i = 0
def truc():
    global i
    if (False):
        i = 0
处理此问题的其他方法是:

i
大写,您可以在不使用
global
的情况下访问它,但是
i
是不可更改的,这似乎不适合您的情况


i
作为参数。这使得代码不那么凌乱,以后更容易调试。

糟糕但快速的方法:将
global i
添加到函数中。这是一个很好的方法,需要更多的字符:不要在函数中更改全局变量,而是将其作为参数传入并返回新值,使用
i=truc(i)
调用它。从长远来看,更容易控制。返回新值并将变量设置为返回值,也可以使用类并将其作为属性,只需避免使用全局变量。