python中,对象分为可变(mutable)和不可变(immutable)两种类型。
元组(tuple)、数值型(number){int,float}、字符串(string)均为不可变对象,而字典型(dictionary)和列表型(list)的对象是可变对象。
{我对可变对象的理解就是,变量a将其赋值给另一个变量b,修改这个变量b会直接修改原变量a,而不可变对象,就会复制变量a进行修改,不会修改原变量a;即可变对象引用指向一个,而不可变对象,随着修改,会指向不同的引用}
#coding:utf-8;
i_int = 10
j_int = 10
k_int = 11
i_str = 'Python'
j_str = 'Python'
k_str = 'python world'
i_tuple = (1,2)
j_tuple = (1,2)
k_tuple = (1,2,3)
print "i_int's id",str(id(i_int))
print "j_int's id",str(id(j_int))
print "k_int's id",str(id(k_int))
print "i_str's id",str(id(i_str))
print "j_str's id",str(id(j_str))
print "k_str's id",str(id(k_str))
print "i_tuple's id",str(id(i_tuple))
print "j_tuple's id",str(id(j_tuple))
print "k_tuple's id",str(id(k_tuple))
output:
i_int's id 30498944
j_int's id 30498944
k_int's id 30498920
i_str's id 140092758495168
j_str's id 140092758495168
k_str's id 140092757760912
i_tuple's id 140092757580688
j_tuple's id 140092757580760
k_tuple's id 140092757698192
发现了int,str的指向的值是一样的,那么它们的内存id一致;
值得注意的是tuple虽然都是(1,2),但内存id是不一样的;
j_int = j_int + 1
j_str = j_str + str("Add something")
print "Modified:j_int's id",str(id(j_int))
print "Modified:j_str's id",str(id(j_str))
output:
Modified:j_int's id 30498920
Modified:j_str's id 140092757761304
可以看到j_int和j_str的id已经改变,不再指向原来id。
#immutable
tmp = j_int
print "tmp's id",str(id(tmp))
tmp = tmp + 1
print "Modified:tmp's id",str(id(tmp))
print "j_int",j_int
print "tmp",tmp
#mutable
dt = {1:'1',2:'2'}
d = dt
print "dt's id",str(id(dt))
print "d's id",str(id(d))
d[3]='3'
print "dt's id",str(id(dt))
print "d's id",str(id(d))
for i in dt.keys():
print "dt's key",i
for i in d.keys():
print "d's key",i
output:
tmp's id 30498920
Modified:tmp's id 30498896
j_int 11
tmp 12
dt's id 140092757766224
d's id 140092757766224
dt's id 140092757766224
d's id 140092757766224
dt's key 1
dt's key 2
dt's key 3
d's key 1
d's key 2
d's key 3