如果我从一个方法(不涉及类)中更改在文件/模块顶部声明的变量,则它只适用于列表/容器的情况,但如果变量是一个简单的计数器,则不起作用。例如,请参见以下代码:
counter = 0
counterList = []
def incrementCounter():
counter += 1
def addToList():
counterList.append(1)
# works:
addToList()
# doesn't work:
incrementCounter()
print counterList, counter
这种不同行为的原因是什么?在
实际原因是您没有通过附加到列表来更改列表的值。如果递增counter,则表示更改了该值,除非将其声明为
global
,否则这是不允许的。在试试看
对
incrementCounter()
内部的counter
赋值,否则隐式地使counter
成为该函数的局部。在行
^{pr2}$counter += 1
实际上并没有将integer对象counter
点更改为Python中不可变的整数。这条线相当于从而创建一个新的整数对象,并使名称
counter
指向新的整数对象。在编译函数时,Python会检测到对counter
的赋值,并假定名称counter
是函数的本地名称,甚至在赋值之前也是如此。当执行上述行时,将计算右侧。Python试图在本地名称空间中查找名称counter
,因为它假定counter
是本地的。但是在本地命名空间中没有这样的名称,因此出现错误消息。在相关问题 更多 >
编程相关推荐