Python sees everything as object. Every object has an identity, value and a type. Object identity and type are invariable.
Object type determines if value is mutable or otherwise.
Lifetime of object is based on reference count mechanism.
Object Container
Object containers are: list, dictionary, tuple, set. Containers keep reference (object identity) to objects. Mutability of container is based on references. The value of the referred object could be mutable.
Let’s see how they behave:
from sys import getrefcount a = 1 b = 1 list1 = [] list2 = [] t1 = (a, b) t2 = (a, b) # a and b share reference to same object ID print "a=", id(a) print "b=", id(b) # Constant 1 has ref count of +2 (a and b) print "getrefcount(1)=", getrefcount(1) # Constant 1 has ref count of +3 now (a,b and c) c = 1 print "getrefcount(1)=", getrefcount(1) # Decrement the object ref count del c print "getrefcount(1)=", getrefcount(1) # Default ref count of an unused new integer object is 3. But, why? print "getrefcount(999999)=", getrefcount(999999) print "" # Mutable objects like list do not refer to same object ID, even # though value of objects are same! print "list1=", id(list1) print "list2=", id(list2) print "getrefcount(list1)=", getrefcount(list1) print "getrefcount(list2)=", getrefcount(list2) print "" print "t1=", id(t1) print "t2=" ,id(t2) # Containers have default ref count of 2 print "getrefcount(t1)=", getrefcount(t1) print "getrefcount(t2)=", getrefcount(t2) # Changing contained object values do not modiy immutable container a = 3 b = 10 print "t1=", id(t1) print "t2=" ,id(t2) # String literals are constant and are referred to like numbers s1 = "hello" s2 = "hello" # s1 and s2 refer to same object print "s1=", id(s1) print "s2=" ,id(s2) print "getrefcount(hello)=", getrefcount("hello") # The first use of a literal uses 3 ref count print "getrefcount(hello!!)=", getrefcount("hello!!") s3 = "hello!" print "getrefcount(hello!)=", getrefcount("hello!")
Reblogged this on Sutoprise Avenue, A SutoCom Source.
LikeLike