写点什么

软件测试 / 人工智能丨身份运算符

作者:测试人
  • 2023-12-11
    北京
  • 本文字数:1189 字

    阅读完需:约 4 分钟

Python 中的身份运算符用来判断两个对象的引用是否为同一个,换言之,就是用来比较两个对象的内存地址是否相同。

Python 对数字和字符串做了一些优化以提高性能和减少内存开销。以下是 Python 对数字和字符串做的一些优化:

  • 整数池(Integer Pool):Python 会在程序运行时预先创建一些整数对象,并将其保存在整数池中。这样,在创建整数对象时,可以重用已存在的对象,而不是创建新的对象。这在一定程度上减少了内存开销。

  • 字符串池(String Pool):对于较短的字符串,Python 会使用字符串池进行优化。字符串池是一个缓存区,保存着所有共享相同内容的字符串对象。当创建新的字符串对象时,Python 会首先检查是否已经存在相同内容的字符串对象,如果存在,则直接重用已有的对象,避免重复创建新的对象。

因此,在某些情况下,字面量相同的两个对象,实际并不是同一个对象,此时如果需要区分对象的话,就需要使用身份运算符。

身份运算符如下表所示:


身份运算符 is

is 用来判断两个对象内存引用地址是否相同,如果相同,结果为真 True,如果不相同,结果为假 False。

# 示例 1str1 = "Hello"str2 = "Hello"print(id(str1))  # 输出第一个字符串对象的内存地址print(id(str2))  # 输出第二个字符串对象的内存地址print(str1 == str2)print(str1 is str2)# 示例 2str3 = "Hello, World!" * 1000str4 = "Hello, World!" * 1000print(id(str3))  # 输出第一个字符串对象的内存地址print(id(str4))  # 输出第二个字符串对象的内存地址print(str3 == str4)print(str3 is str4)
复制代码

注意:两个字面量相同的对象,内存地址未必相同,就像两个双胞胎,长的相同,但是是两个独立的个体。

身份运算符 is not

is not 用来判断两个对象内存引用地址是否不同,如果不同,结果为真 True,如果相同,结果为假 False。

# 示例 1str1 = "Hello"str2 = "Hello"print(id(str1))  # 输出第一个字符串对象的内存地址print(id(str2))  # 输出第二个字符串对象的内存地址print(str1 == str2)print(str1 is not str2)

# 示例 2str3 = "Hello, World!" * 1000str4 = "Hello, World!" * 1000print(id(str3)) # 输出第一个字符串对象的内存地址print(id(str4)) # 输出第二个字符串对象的内存地址print(str3 == str4)print(str3 is not str4
复制代码

is 和 == 的区别

在 Python 中,万物皆对象,而对象的三个基本要素:

  • 内存地址

  • 数据类型

而 is 与==都作为常用的判断语句去进行使用,这两者之间的主要区别是:

  • ==运算符: 只比较两个对象的值,相同返回 True,不同返回 False。

  • is 运算符: 比较两个对象的 id,相同返回 True,不同返回 False。

在这种场景下, 两个判断的执行结果均为 True。

a, b = 1,1# 判断a,b 是否相等print(a == b)print(a is b)
复制代码

在这种场景下, 两个判断的执行结果不一致。

a = [1,2,3]b = [1,2,3]# 对比值一致,返回Trueprint(a == b)# 对比内存地址不一致,返回Falseprint(a is b)
复制代码



发布于: 刚刚阅读数: 5
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
软件测试/人工智能丨身份运算符_人工智能_测试人_InfoQ写作社区