Why does CPython (no clue about other Python implementations) have the following behavior?
tuple1 = ()
tuple2 = ()
CPython is garbage collecting objects as soon as they go out of scope, so the second [] is created after the first [] is collected. So, most of the time it ends up in the same memory location.
This shows what's happening very clearly (the output is likely to be different in other implementations of Python):
class A(object):
def __init__(self): print "a",
def __del__(self): print "b",
# a a b b False
print A() is A()
# a b a b True
print id(A()) == id(A())