前言
在C语言中变量所分配到的地址是内存空间中一个固定的位置,当我们改变变量值时, 对应内存空间中的值也相应改变。在Python中变量存储的机制是完全不一样的,当给一个变量赋值时首先解释器会给这个值分配内存空间,然后将变量指向这个值的地址,那么当我们改变变量值的时候解释器又会给新的值分配另一个内存空间,再将变量指向这个新值的地址,所以和C语言相比,在Python中改变的是变量所指向的地址,而内存空间中的值是固定不变的。
例程介绍
我们可以通过id方法查看变量的内存地址的方式来进行验证。以下先以Python的int类型为例,可以看到执行 i += 1 后,变量i的内存地址会发生变化,事实上 i += 1 并不是在原有变量i的地址上加1,而是重新创建一个值为6的int对象,变量i则引用了这个新的对象,因此当变量i和变量j的值相同时会指向同个内存地址 。同样以Python的float 类型为例也验证了这个变量存储管理的机制。
#int
i = 5
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
i += 1
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
j = 5
print "j ---> ",j
print "id(j) ---> ",hex(id(j))
______________________
i ---> 5
id(i) ---> 0xa26f880
i ---> 6
id(i) ---> 0xa26f874
j ---> 5
id(j) ---> 0xa26f880
#float
i = 1.5
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
i += 1
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
j = 1.5
print "j ---> ",j
print "id(j) ---> ",hex(id(j))
______________________
i ---> 1.5
id(i) ---> 0x9e86c8c
i ---> 2.5
id(i) ---> 0x9e86cac
j ---> 1.5
id(j) ---> 0x9e86c8c
接下来以Python的list类型为例,可以看到list变量i在append之后,仍然指向同一个内存地址,而j、k的值虽然相同,但是指向的内存地址却不同。我们通过j = k 的赋值语句可以让j、k指向同一个内存地址,对j、k任意一个list变量进行修改,都会影响另外一个list变量的值。比如j变量append(4)时,同时对k变量也产生影响,查看j、k的内存地址,发现它们仍然指向了同个内存地址。
#list
i = [1, 2, 3]
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
i.append(4)
print "i ---> ",i
print "id(i) ---> ",hex(id(i))
j = [1.5, 2.5, 3.5]
print "j ---> ",j
print "id(j) ---> ",hex(id(j))
k = [1.5, 2.5, 3.5]
print "k ---> ",j
print "id(k) ---> ",hex(id(k))
j = k
print "j ---> ",j
print "id(j) ---> ",hex(id(j))
print "k ---> ",j
print "id(k) ---> ",hex(id(k))
j.append(4)
print "j ---> ",j
print "id(j) ---> ",hex(id(j))
print "k ---> ",j
print "id(k) ---> ",hex(id(k))
______________________
i ---> [1, 2, 3]
id(i) ---> 0xb73fa1acL
i ---> [1, 2, 3, 4]
id(i) ---> 0xb73fa1acL
j ---> [1.5, 2.5, 3.5]
id(j) ---> 0xb6fed06cL
k ---> [