I'm trying to build a tkinter GUI, and I'm having a Python programming logic issue. My problem is the following: I'm creating a bunch of objects in the following way:
class Aplication:
def createObjects(self):
objects = []
for i in range(10):
obj = Object(command = lambda: self.myFunction(i))
objects.append(obj)
def myFunction(self, i):
print(i)
And when executing each object's command I expected the result:
0
1
2
3
4
5
6
7
8
9
But instead I'm getting:
9
9
9
9
9
9
9
9
9
9
I simplified my code so that anyone who knows Python logic can help me. Appreciate any help in advance.
This slightly modified version works as you expect.
It is essentially the variable scope problem.
In your implementation, the function looks for i
in the runtime, when i
has already been updated to 9.
If you want to keep the "current" value of i
, you need to define a function with the current i
like below.
class Object:
def __init__(self, command):
self.command = command
class Application:
def createObjects(self):
objects = []
for i in range(10):
obj = Object(command = self.myFunction(i))
objects.append(obj)
return objects
def myFunction(self, i):
return lambda: print(i)
a = Application()
os = a.createObjects()
for o in os:
o.command()