While refactoring one of my old scripts, I stumbled upon a weird thing about referencing in Python. Asked to one of my friends and it turned out to be a quite entertaining/depressing talk..
Here are some notes about Python which made me say “what in the..”:
Integers are objects, but some are special
a = 7 a is 7 > True a = 300 a is 300 > False
Nonsense? Somehow. Turns out first between -5 and 256 (inclusive) the integer objects are predefined. So if you want to set a variable to it, it merely becomes a reference. Check this out:
a = 5 id(5) > 139999587484016 id(a) > 139999587484016 # <- Same object a = 280 # <- You're allocating something new now id(280) > 139999546571984 id(a) > 139999546557200 # <- Not anymore
False == False in [False] > True
Ehm. Excuse me?
Turns out this one is also not working like I thought. I was thinking this must be evaluated by a priority/order thing. Looks like that is equivalent to
(False == False) and (False in [False]), so it makes sense 💡
Default variable doesn’t care about your mortal scope
Consider this function:
def tmp(a=): a.append('a') return a
As you can guess, if you call this without any argument it will return
['a']. But watch this:
tmp() > ['a'] tmp() > ['a', 'a'] tmp() > ['a', 'a', 'a']
I don’t even question this one. Time to flip the table.
But wait, there are a lot more!
Do you know there is a dedicated repository which explains all of these, and more: WTF Python
I guess I’ll keep this as a bookmark and read slowly to keep myself calm.