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

52 阅读3分钟

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

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

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

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

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

身份运算符如下表所示:

图片

身份运算符 is

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

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

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

身份运算符 is not

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

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


# 示例 2
str3 = "Hello, World!" * 1000
str4 = "Hello, World!" * 1000
print(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]
# 对比值一致,返回True
print(a == b)
# 对比内存地址不一致,返回False
print(a is b)

微信图片_20231211104856.jpg