如果我从一个方法(不涉及类)中更改在文件/模块顶部声明的变量,它只在列表/容器的情况下工作,但如果我的变量是一个简单的计数器,则不会工作。例如,请参见以下代码:

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/

10-16 12:23