Python 中的 == 与 is 及其他
admin
2023-07-31 01:49:32
0

摘要:Python 中对于对象的比较分为值比较和对象身份比较,文中对于两种比较及引用赋值给出了介绍。


比较对象值时使用 == 等逻辑操作符,比较的是对象的值;比较对象身份时使用 is 和 is not 操作符,比较的是对象的本身,即可理解为对象的地址,该地址可以由id()函数获得。

理解过程中可以类比 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 也随之改变,两个变量的地址是相同的。

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 时,表示文件被删除。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...