#Python Summary Part 1
Python中的变量:
首先Python中的变量,更像引用或者说标签。看下面的例子。
>>> a = 1
>>> b = 1
>>> id(a)
30843680
>>> id(b)
30843680
>>> a = '122333333'
>>> b = '122333333'
>>> id(a)
46196128
>>> id(b)
46196128
其中id()函数是获得变量的内存地址,上例中a和b的内存地址是相同的,也就是说他们是同一个东西。
这是因为Python使用了内存池技术(干货1、干货2)。由于Python的这个特点,导致这些变量其实不能称为变量(不可变的变量)。
Python中的基础数据类型有:
数(分为int long float complex),字符串(str),元组(tuple),列表(list),字典(dict)。
其中数,字符串,元组就属于不可变的。
对于这些数据类型而言,如果a的值与b的值一样,那么一般来说a的id和b的id是一样的。
而对于列表和字典来说,如果a的值与b的值一样,a和b的id可能一样也可能不一样,这个就要看a和b是怎么来产生的了。例如:
>>> a = {1:'a',2:'b',3:'c',4:'d',5:'e'}
>>> b = {1:'a',2:'b',3:'c',4:'d',5:'e'}
>>> id(a)
46104624
>>> id(b)
46095360
和>>> a = {1:'a',2:'b',3:'c',4:'d',5:'e'}
>>> b =a
>>> id(a)
46104624
>>> id(b)
46104624
如果b是单独产生,而不是用b=a这样子的语句产生,那么b和a的id是不一样的,反之则id相同。
所以,b=a这样子的赋值语句在一定程度上可以认为,a和b都是标签,b标签和a标签是一样的。
总结一下:
对于不可变的数据类型(数、字符串、元组)而言,因为数据不可变,所以一个同样的数据只需要一个固定的空间来储存,所以他们值一样,标签也一样。
对于可变的数据类型(列表、字典),因为数据可变,所以跟数据初值无关,都会开辟新的空间来引用这个数据,他们的未来可能不一样,所以无法使用同一块空间,所以标签不一样。而对于b=a这样子的语句,只是把a标签赋值给了b标签,从而引用了同一块数据,所以他们的id是一样的。
亦或可以这样子说,Python中变量实际是C中的指针。
>>> a = {1:'I',2:'am',3:'Rex'}
>>> b = {1:'I',2:'am',3:'Rex'}
>>> a[3]='Du'
>>> print a
{1: 'I', 2: 'am', 3: 'Du'}
>>> print b
{1: 'I', 2: 'am', 3: 'Rex'}
这个例子中,a和b是指向不同空间的指针。
>>> a = {1:'I',2:'am',3:'Rex'}
>>> b =a
>>> a[3]='Du'
>>> print a
{1: 'I', 2: 'am', 3: 'Du'}
>>> print b
{1: 'I', 2: 'am', 3: 'Du'}
这个例子中,a和b是指向相同空间的指针。
在Python中,有is 和 == 来判断两个量的关系。
当两个变量id相同,is返回True,其他为False。
当两个变量值(Value)相同,==返回True,其他为False。
综上所述:Python中的赋值有很大的坑存在。。。。为了不踩,所以别把”变量“当作变量,而要称为引用或者指针。