Skip to content

Latest commit

 

History

History
92 lines (60 loc) · 2.32 KB

File metadata and controls

92 lines (60 loc) · 2.32 KB

动态类型

变量 对象 引用

当我们给一个变量赋值的时候:

a = 3

python 会执行三个步骤去完成这个请求:

  1. 创建一个对象来代表值3
  2. 创建一个变量a,如果它还没有创建的话
  3. 将变量与新的对象3连接

在 python 中变量到对象的连接称作引用,它的底层是用指针来实现的。用具体的术语讲:

  • 变量是一个系统表的入口,包含了指向对象的连接
  • 对象是被分配到的一块内存,有足够的空间去表示它们所代表的值
  • 引用是自动形成的从变量到对象的指针

类型属于对象,而不是变量

a = 3
a = 'spam'
a = 1.23

看起来似乎 a 的类型从整数变成了字符串,又变成了浮点数。其实并非如此,python 中变量名没有类型,只是把a修改为对不同的对象的引用。实际上,python 的对象就是在特定的时间引用了一个特定的对象。

每个对象都包含了一个头部信息,其中标记了这个对象的类型。

对象的垃圾收集

当一个变量名被赋予一个新的对象,如果原来的对象没有被其他的变量名或对象所引用的话,那么之前的那个对象占用的空间就会被回收。

对象的头部信息中,有一个计数器,记录了当前指向该对象的引用的数目。一旦这个计数器被设置为零,这个对象的内存空间就会自动回收。

共享引用

多个变量名引用了同一个对象,这叫共享引用。

a = 3
b = a

思考下面的例子:

a = 3
b = a
a = a + 2

在 python 中给一个变量赋一个新值,并不是原位置修改原有的对象,而是让这个变量去引用完全不同的一个对象。

原位置修改

L1 = [2, 3, 4]
L2 = L1

L1[0] = 12

L1
[12, 3, 4]

L2
[12, 3, 4]

因为列表是可以原位置修改元素的可变对象,所以会影响所有引用了同一对象的所有变量。可变对象包括,列表,字典,集合以及通过class语句定义的对象。

共享引用和相等

python 中有两种不同的方法检测变量是否相等

L = [1, 2, 3]
M = L

L == M
True

L is M
True

== 运算符检查两个被引用的对象是否值相等。is 运算符检查两个对象是否是同一个对象。