如果我从一个方法(不涉及类)中更改在文件/模块顶部声明的变量,它只在列表/容器的情况下工作,但如果我的变量是一个简单的计数器,则不会工作。例如,请参见以下代码:
counter = 0
counterList = []
def incrementCounter():
counter += 1
def addToList():
counterList.append(1)
# works:
addToList()
# doesn't work:
incrementCounter()
print counterList, counter
这种不同行为的原因是什么?
最佳答案
尝试
def incrementCounter():
global counter
counter += 1
否则,
counter
内部的incrementCounter()
赋值将隐式地使counter
成为该函数的本地值。行
counter += 1
实际上不会将整数对象counter
点更改为--整数在Python中是不可变的。这条线相当于counter = counter + 1
因此,创建一个新的整数对象,并使名称
counter
指向该新的整数对象。在编译该函数时,Python会检测到对counter
的赋值,并假定该函数的名称counter
甚至在赋值之前就已经是本地的。执行上述行时,将计算右侧。Python尝试在本地名称空间中查找名称counter
,因为它假设counter
是本地的但是在本地命名空间中没有这样的名称,因此出现错误消息。关于python - 在Python中,为什么计数器会出现“未定义的局部变量”错误,而列表却不会?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5885978/