在Python中,为什么计数器会出现“未定义的局部变量”错误,而列表没有呢?

2024-04-19 11:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

counter = 0
counterList = []

def incrementCounter():
    counter += 1

def addToList():
    counterList.append(1)

# works:
addToList()

# doesn't work:
incrementCounter()    

print counterList, counter

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


Tags: 模块文件方法代码声明列表defcounter
2条回答

实际原因是您没有通过附加到列表来更改列表的值。如果递增counter,则表示更改了该值,除非将其声明为global,否则这是不允许的。在

试试看

def incrementCounter():
    global counter
    counter += 1

incrementCounter()内部的counter赋值,否则隐式地使counter成为该函数的局部。在

counter += 1实际上并没有将integer对象counter点更改为Python中不可变的整数。这条线相当于

^{pr2}$

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

相关问题 更多 >