摘要:Python 中对于对象的比较分为值比较和对象身份比较,文中对于两种比较及引用赋值给出了介绍。node
比较对象值时使用 == 等逻辑操做符,比较的是对象的值;比较对象身份时使用 is 和 is not 操做符,比较的是对象的自己,便可理解为对象的地址,该地址能够由id()函数得到。python
理解过程当中能够类比 C 语言中变量的比较,例如对于变量 a 和 b,比较值至关于 a == b,比较身份至关于 &a == &b,即对两个变量分别取地址,以后比较这两个地址。函数
Python 中使用大量使用引用赋值。经过 b = a 的操做,C 语言中是将 a 的值赋给 b,两个变量的地址不一样;Python 中则经过引用赋值,直接使 b 和 a 指向相同的地址,这样就能够复用内存,使得存储更高效。
不过在使用过程当中,对于不可改变类型,或者表述为“标量存储类型”,这个操做对于用户是透明的,即对于用户来讲至关于普通复制赋值,以下。使用 b = a 赋值后,能够看到,两个变量的 id 是相同的,即内存中地址相同。改变 b 的值后能够看到,系统自动给 b 分配了新的地址空间,改变 b 并无引发 a 的改变。指针
python>>> a = 1 >>> b = a >>> id(a) 29667592L >>> id(b) 29667592L >>> b += 1 >>> a 1 >>> b 2 >>> id(a) 29667592L >>> id(b) 29667568L
对于可变类型,Python 真的是使用引用赋值,以下。能够发现对于 list 类型,改变了 b 的值后 a 也随之改变,两个变量的地址是相同的。code
python>>> a = [1, 2] >>> b = a >>> id(a) 34412232L >>> id(b) 34412232L >>> b += [3] >>> a [1, 2, 3] >>> b [1, 2, 3] >>> id(a) 34412232L >>> id(b) 34412232L
若须要对于 list 类型使用复制赋值,须要使用技巧 b = a[:],此时系统会为 b 分配新的地址,并赋予之一份 a 的拷贝,以下。对象
python>>> a = [1, 2] >>> b = a[:] >>> a [1, 2] >>> b [1, 2] >>> id(a) 34520264L >>> id(b) 34520456L >>> b += [3] >>> a [1, 2] >>> b [1, 2, 3] >>> id(a) 34520264L >>> id(b) 34520456L
Python 中对于内存的管理是自动的,不须要程序猿参与。系统对于每一个变量的内存空间添加了一个计数器,没增长一个引用,即有新的指针指向这个地址时,就对计数器加一,反之减一。当计数器的值为 0 时,系统回收这块内存。当使用 del 操做时,直接将该变量所在内存的计数器置为 0,即直接删除之。内存
这种管理方式在 Linux/Unix 的文件系统中也在使用,*nix 系统采用 inode 格式来管理文件。这种管理方式采用惟一的 id 来标识文件,而文件名只是一个普通属性,所以能够在文件打开过程当中修改文件名。每当对于文件建立一个新的硬连接,系统就会将文件的计数器加一,当计数器的值为 0 时,表示文件被删除。变量