在Python中,为什么我会为计数器而不是列表获得“未定义的局部变量”错误?

时间:2011-05-04 15:34:09

标签: python

如果我在一个方法中修改了在文件/模块顶部声明的变量(没有涉及类),它只适用于列表/容器,但如果我的变量是一个简单的计数器则不行。例如,请参阅以下代码:

counter = 0
counterList = []

def incrementCounter():
    counter += 1

def addToList():
    counterList.append(1)

# works:
addToList()

# doesn't work:
incrementCounter()    

print counterList, counter

这种不同行为的原因是什么?

2 个答案:

答案 0 :(得分:9)

尝试

def incrementCounter():
    global counter
    counter += 1

counter incrementCounter()内的counter分配隐含地使counter += 1成为该功能的本地。

counter实际上并没有将整数对象counter = counter + 1 指向 - 整数在Python中是不可变的。这条线相当于

counter

从而创建一个新的整数对象,并使名称counter指向该新的整数对象。在编译函数时,Python检测到counter的赋值,并假定名称counter在函数的本地,甚至在赋值之前。执行上述行时,将评估右侧。 Python尝试在本地命名空间中查找名称counter,因为它假定{{1}}是本地的。但是在本地名称空间中没有这样的名称,因此出现错误消息。

答案 1 :(得分:3)

实际原因是您没有通过附加更改列表的值。如果增加计数器,则表示您正在更改该值,这是不允许的,除非您将其声明为global