Python变量、对象和值的关系

前面的例子中我们已经用到了变量,如:

>>> a = 12

就创建了变量,而且变量的值为 12,但对象接触的不是很多。

变量就是一个符号,或者说是名字。类比现实生活,相当于是身份证。

对象是一段存储空间,简单来说就是一块内存。类比现实生活就是某个具体的人。对象有很多属性,其中一个属性就是类型。相同类型的对象有很多一样的属性。类型就类似于国籍,相同国籍的人虽然不同,但是有很多一样的属性,如所有中国人都有一个户口的属性,其他国家的人就没有这个属性。

值就是对象的详细属性。如某个整型对象,其值为 100,而另外一个整型对象,其值就为 800。

图1所示描述了它们的关系。
变量、对象和值的关系
图1:变量、对象和值的关系

它们的关系是每个变量一定对应某个对象,变量的值就是该变量对应对象的值。每个对象有三个基础属性,id、类型和值。每个对象的 id 是不同的,但是两个不同对象的类型和值可以相同。

可以使用“id(变量名)”来获得对象的 id。
>>> a = 12
>>> id(a)      # 得到变量a对应对象的id
140377101203968
>>> b = "abc"  # 新建一个字符串对象,并让变量b指向该对象
>>> id(b)      # 得到变量b对应对象的id
4370848984
可以使用“type(变量名)”来查看对象的类型。
>>> a = 12
>>> type(a)
<type 'int'>
>>> b = "abc"
>>> type(b)
<type 'str'>
可以通过变量名来得到对象的值。
>>> a = 12  # 创建一个对象,其值为12,并且用a来记录它
>>> a       # 得到a所对应的对象的值
12
>>> a = 13  # 修改a所对应的对象的值
>>> a       # 得到a所对应的对象的值
13
前面提到某个变量一定有一个对应的对象,那么随着时间的推移,某个变量是否可以对应到另外一个对象上呢?这个是可以的。
>>> a = 12
>>> id(a)
140377101203968
>>> a = "abc"
>>> id(a)  # id发生了变化,变量a所对应的对象也发生了变化
4370848984
可以用图2来表示该过程。开始变量 a 指向值为 12 的对象,后来 a 指向了一个新的对象,该对象值为“abc”。

变量重新赋值
图2:变量重新赋值

那么可不可以两个变量对应同一个对象呢?答案是可以的。如下面的情况:
>>> a = [1, 2, 3, 4]
>>> id(a)
4370717152
>>> b = a
>>> id(b)   # 变量b对应的对象和变量a对应的对象的id相同
4370717152  # 这说明a和b指向同一个对象

可以用图3来表示这种情况。
变量共用对象
图3:变量共用对象

这时对 a 的修改和对 b 的修改是一样的。
>>> a = [1, 2, 3, 4]
>>> id(a)
4370717152
>>> b = a
>>> id(b)
4370717152
>>> a.append(100)  # 修改变量a指向的对象
>>> a
[1, 2, 3, 4, 100]
>>> b              # b指向的对象也发生了改变
[1, 2, 3, 4, 100]

那么如何知道两个变量对应的对象是同一个对象呢?可以通过判断 id 是否相等来确定。
>>> a = [1, 2, 3, 4]
>>> b = a
>>> id(a) == id(b)  # 判断a和b的id是否相等
True

也可以通过 is 操作符来判断,如下:
>>> a = [1, 2, 3, 4]
>>> b = a
>>> a is b
True

另外一种情况是两个不同的对象有相同的值。
>>> a = 1024
>>> b = 1000 + 24
>>> a
1024
>>> b
1024
>>> id(a)   # 变量a指向的对象和变量b指向的对象是两个对象
140377101238440
>>> id(b)
140377101238464
>>> a is b  # 此时通过is操作返回False
False

这种情况可以用图4来表示。

不同对象的值相同
图4:不同对象的值相同