Looks weird? You're not alone.
Python caches small integers between -5 and 256 for performance. So a and b point to the same object. But x and y are different objects, even though they have the same value.
This is part of Python's internal optimization. Itβs not about math. itβs about memory references under the hood.
Bottom Line?
Use == when you care about value, not identity.
Because sometimes
Python caches small integers between -5 and 256 for performance. So a and b point to the same object. But x and y are different objects, even though they have the same value.
This is part of Python's internal optimization. Itβs not about math. itβs about memory references under the hood.
Bottom Line?
Use == when you care about value, not identity.
print(x == y)
# True β
Because sometimes
is
isnβt what you think it is πβ€5
Feels off?
It's because all your objects share one variable (without you realizing it)
At first glance, it seems like every object should start fresh, right? But in this case, count is a class variable, which means itβs shared by all instances of the class.
Every time you create a new
If your goal is to give each object its own value, define it like this instead
Now, each instance has its own count, stored on the object itself . no sharing, no surprises.
It's because all your objects share one variable (without you realizing it)
At first glance, it seems like every object should start fresh, right? But in this case, count is a class variable, which means itβs shared by all instances of the class.
Every time you create a new
Counter()
, youβre actually incrementing the same shared variable not something unique to each object.If your goal is to give each object its own value, define it like this instead
class Counter:
def __init__(self):
self.count = 1
Now, each instance has its own count, stored on the object itself . no sharing, no surprises.
β€2
Wait, why did all functions return 2?
The lambdas donβt capture the value of
This is called late binding and can cause unexpected behavior when creating closures inside loops.
So as a quick tip, Bind the current value at definition time using a default argument(like shown in the second image) Then each lambda remembers its own
The lambdas donβt capture the value of
i
at each loop iteration, they capture the variable itself. By the time you call the functions, the loop has finished, and i
is left at its final value, 2.This is called late binding and can cause unexpected behavior when creating closures inside loops.
So as a quick tip, Bind the current value at definition time using a default argument(like shown in the second image) Then each lambda remembers its own
i
value independently.β€2