Reputation: 163
If I alter a variable declared at the top of the file/module from within a method (no classes involved), it only works in the case of lists/containers, but not if my variable was a simple counter. See the following code for example:
counter = 0
counterList = []
def incrementCounter():
counter += 1
def addToList():
counterList.append(1)
# works:
addToList()
# doesn't work:
incrementCounter()
print counterList, counter
What is the reason for this differing behaviour?
Upvotes: 2
Views: 1294
Reputation: 602775
Try
def incrementCounter():
global counter
counter += 1
The assignment to counter
inside incrementCounter()
otherwise implicitely makes counter
local to that function.
The line counter += 1
does not actually change the integer object counter
points to -- integers are immutable in Python. The line is rather equivalent to
counter = counter + 1
thus creating a new integer object and making the name counter
point to that new integer object. When compiling the function, Python detects the assignment to counter
and assumes the name counter
to be local to the function even before the assignment. When the above line gets executed, the right hand side is evaluated. Python tries to look up the name counter
in the local namespace, since it assumes counter
to be local. There is no such name in the local namespace though, hence the error message.
Upvotes: 10
Reputation: 3725
The actual reason is that you are not changing the value of the list by appending to it. If you increment counter, you are changing the value, which is not allowed, unless you declare it as global
.
Upvotes: 3