The body of the lambda
in your code references the name x
. The value associated with that name is changed on the next iteration of the loop, so when the lambda is called and it resolves the name it obtains the new value.
To achieve the result you expected, bind the value of x
in the loop to a parameter of the lambda
and then reference that parameter, as shown below:
def main():
d = {}
for x in [1,2]:
d[x] = lambda x=x: print(x)
d[1]()
d[2]()
if __name__ == '__main__':
main()
>>>
1
2