如果我在一个方法中修改了在文件/模块顶部声明的变量(没有涉及类),它只适用于列表/容器,但如果我的变量是一个简单的计数器则不行。例如,请参阅以下代码:
counter = 0
counterList = []
def incrementCounter():
counter += 1
def addToList():
counterList.append(1)
# works:
addToList()
# doesn't work:
incrementCounter()
print counterList, counter
这种不同行为的原因是什么?
答案 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
。