pin_drop当前位置:知识文库 ❯ 图文

Python身份运算符is和is not

概述

身份运算符用于比较两个对象的内存地址是否相同,即判断它们是否是同一个对象。Python提供了isis not两个身份运算符。身份运算符与比较运算符==有着本质区别:is比较的是对象的身份(内存地址),而==比较的是对象的值。本节将详细介绍身份运算符的用法、is==的区别以及Python的小整数池机制。


is运算符

is运算符判断两个变量是否引用同一个对象,即它们的内存地址是否相同。

基本语法

代码示例

a is b

等价于:

代码示例

id(a) == id(b)

使用示例

代码示例

a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(f"a is c: {a is c}")
print(f"a is b: {a is b}")
print(f"a == b: {a == b}")
print(f"id(a) = {id(a)}")
print(f"id(b) = {id(b)}")
print(f"id(c) = {id(c)}")

输出:

代码示例

a is c: True
a is b: False
a == b: True
id(a) = 140234567890240
id(b) = 140234567891200
id(c) = 140234567890240

提示ac指向同一个列表对象,所以a is cTrueab虽然值相同,但是不同的对象,所以a is bFalse

None的判断

is运算符最常见的用途是判断变量是否为None

代码示例

x = None

if x is None:
    print("x是None")

if x is not None:
    print("x不是None")

提示:PEP 8规范推荐使用is None而非== None来判断是否为None

布尔值的判断

代码示例

flag = True

if flag is True:
    print("flag是True")

if flag is False:
    print("flag是False")

is not运算符

is not运算符是is的否定形式,判断两个变量是否不是同一个对象。

基本语法

代码示例

a is not b

使用示例

代码示例

a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(f"a is not b: {a is not b}")
print(f"a is not c: {a is not c}")

输出:

代码示例

a is not b: True
a is not c: False

判断不为None

代码示例

result = "success"

if result is not None:
    print(f"结果: {result}")

is notnot ... is的等价性

a is not bnot a is b完全等价:

代码示例

a = [1]
b = [1]

print(a is not b)
print(not a is b)

提示:推荐使用is not,语义更清晰。


is与==的区别

这是Python中一个非常重要且容易混淆的概念。

核心区别

运算符 比较内容 判断依据 示例
is 对象身份 内存地址是否相同 a is b
== 对象值 值是否相等 a == b

列表示例

代码示例

a = [1, 2, 3]
b = [1, 2, 3]

print(f"a == b: {a == b}")
print(f"a is b: {a is b}")

输出:

代码示例

a == b: True
a is b: False

字符串示例

代码示例

a = "hello"
b = "hello"

print(f"a == b: {a == b}")
print(f"a is b: {a is b}")

输出:

代码示例

a == b: True
a is b: True

提示:字符串a is bTrue是因为Python对短字符串进行了驻留(intern)优化,相同内容的字符串可能共享同一对象。

整数示例

代码示例

a = 256
b = 256
print(f"256: a is b = {a is b}")

a = 257
b = 257
print(f"257: a is b = {a is b}")

输出:

代码示例

256: a is b = True
257: a is b = False

提示:这涉及Python的小整数池机制,详见下节。

何时使用is,何时使用==

场景 推荐运算符 原因
判断是否为None is None None是单例对象
判断是否为True/False is True/is False 布尔值是单例
比较数值是否相等 == 比较值而非身份
比较字符串内容 == 比较值而非身份
比较列表内容 == 比较值而非身份
检查是否为同一对象 is 需要身份判断时

小整数池

Python为了优化性能,会对小整数进行缓存,使得相同值的小整数共享同一个对象。

小整数池范围

Python默认缓存-5到256的整数,这些整数在程序启动时就已经创建好,所有引用这些整数的变量都指向同一个对象。

代码示例

a = -5
b = -5
print(f"-5: a is b = {a is b}")

a = 256
b = 256
print(f"256: a is b = {a is b}")

a = 257
b = 257
print(f"257: a is b = {a is b}")

a = -6
b = -6
print(f"-6: a is b = {a is b}")

输出:

代码示例

-5: a is b = True
256: a is b = True
257: a is b = False
-6: a is b = False

字符串驻留

Python也会对字符串进行驻留优化:

代码示例

a = "hello"
b = "hello"
print(f"短字符串: a is b = {a is b}")

a = "hello world!@#"
b = "hello world!@#"
print(f"含特殊字符: a is b = {a is b}")

a = "hello" + " world"
b = "hello world"
print(f"拼接字符串: a is b = {a is b}")

提示:字符串驻留的规则比较复杂,不同Python版本和实现可能不同,不应依赖此行为。

注意事项

代码示例

a = 257
b = 257
print(a is b)

在交互式环境中,上述代码可能输出False(每行独立执行)。但在脚本中,可能输出True(因为编译器优化将同一代码块中的相同字面量合并)。

提示:小整数池和字符串驻留是实现细节,不应在代码中依赖这些行为。比较值用==,判断身份用is


运算符表格

运算符 描述 示例 结果
is 判断是否是同一对象 a is b 取决于id是否相同
is not 判断是否不是同一对象 a is not b 取决于id是否不同

is与==对比表

表达式 含义 比较内容
a is b a和b是同一个对象 id(a) == id(b)
a == b a和b的值相等 a.__eq__(b)
a is not b a和b不是同一个对象 id(a) != id(b)
a != b a和b的值不相等 not a.__eq__(b)

代码示例

示例1:单例模式判断

代码示例

x = None

if x is None:
    print("x未初始化")
else:
    print(f"x的值为: {x}")

result = "success"
if result is not None:
    print(f"操作结果: {result}")

示例2:列表与引用

代码示例

original = [1, 2, 3]
reference = original
copy = original[:]

print(f"original is reference: {original is reference}")
print(f"original is copy: {original is copy}")
print(f"original == copy: {original == copy}")

reference.append(4)
print(f"修改reference后 original = {original}")
print(f"copy = {copy}")

示例3:类型检查

代码示例

value = 42

if type(value) is int:
    print("value是整数类型")
elif type(value) is str:
    print("value是字符串类型")
elif type(value) is float:
    print("value是浮点数类型")

print(type(value) is int)
print(type(value) is not str)

示例4:理解is和==

代码示例

a = [1, 2, 3]
b = a
c = a.copy()

print("=== a, b, c 的值 ===")
print(f"a = {a}, b = {b}, c = {c}")

print("\n=== is 比较(身份) ===")
print(f"a is b: {a is b}")
print(f"a is c: {a is c}")

print("\n=== == 比较(值) ===")
print(f"a == b: {a == b}")
print(f"a == c: {a == c}")

print("\n=== 修改a后 ===")
a.append(4)
print(f"a = {a}")
print(f"b = {b}")
print(f"c = {c}")

注意事项

is判断身份,==判断值:这是最重要的区别,不要混淆。大多数情况下你应该使用==

判断None用isif x is None是Python推荐的写法,因为None是单例对象。

不要用is比较数值和字符串a is b的结果可能因Python实现和运行环境不同而不同。

小整数池是实现细节:-5到256的缓存是CPython的实现优化,不应在代码中依赖。

is not优先于not is:使用a is not b而非not a is b,前者更清晰。

类型检查用istype(x) is inttype(x) == int更准确,因为类型对象是单例。


小结

本节我们学习了:

  • is运算符:判断两个变量是否引用同一个对象(内存地址相同)

  • is not运算符:判断两个变量是否不是同一个对象

  • is与==的区别is比较身份,==比较值,大多数场景用==

  • 小整数池:Python缓存-5到256的整数,是CPython的实现优化

  • 最佳实践:判断None用is None,比较值用==

理解身份运算符与比较运算符的区别,是避免Python编程中常见陷阱的关键。


练习题

练习1

预测以下代码的输出结果,并解释原因:

代码示例

a = [1, 2, 3]
b = [1, 2, 3]
c = a

print(a == b)
print(a is b)
print(a is c)

a.append(4)
print(b)
print(c)

练习2

编写一个函数is_same_object(a, b),分别使用is==比较两个参数,返回一个字典,包含"value_equal"(值是否相等)和"same_identity"(是否是同一对象)两个键。测试该函数,使用整数、字符串、列表和None作为参数。

常见问题

Python中is和==有什么区别?

is比较的是两个对象的身份(内存地址是否相同),而==比较的是两个对象的值是否相等。例如两个内容相同的列表,==返回True,但is返回False,因为它们是不同的对象。

为什么判断None要用is而不是==?

因为None是Python中的单例对象,整个程序中只有一个None实例。使用is None比较的是身份,效率更高且语义更准确。这也是PEP 8规范推荐的写法。

什么是Python的小整数池?

Python为了优化性能,默认缓存了-5到256之间的整数。这些整数在程序启动时就已创建,所有引用这些整数的变量都指向同一个对象。因此对于这个范围内的整数,is比较会返回True。但这是CPython的实现细节,不应在代码中依赖此行为。

为什么相同字符串用is比较有时返回True?

这是Python的字符串驻留(intern)优化机制。对于短字符串和仅包含字母数字的字符串,Python可能会让它们共享同一个对象以节省内存。但驻留规则因Python版本和实现而异,因此比较字符串内容应始终使用==而非is

is not和not is有什么区别?

两者在功能上完全等价,a is not b等同于not a is b。但推荐使用is not,因为它的语义更清晰,可读性更好,也符合Python的编码风格。

标签: 身份运算符 is运算符 is not 小整数池 字符串驻留 Python基础 内存地址 对象比较

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python成员运算符in和not 下一篇: Python运算符优先级

poll相关推荐

作者头像 智能小晨 python

Python类型转换详解

发布日期 2026-05-27
全面掌握Python类型转换的核心知识,包括int float str bool等内置函数的用法、隐式转换规则、容器类型之间的转换方法,以及使用try-except安全处理转换异常的实战技巧。通过丰富的代码示例,帮助你写出更健壮的Python代码。
作者头像 智能小晨 python

Python字符串类型详解

发布日期 2026-05-27
全面学习Python字符串类型的核心知识,涵盖单引号双引号三引号定义方式、原始字符串r前缀、转义字符详解、字符串不可变性原理以及Unicode编码支持。
作者头像 智能小晨 python

Python布尔类型详解

发布日期 2026-05-27
深入解析Python布尔类型的核心知识,包括True和False的定义、and or not逻辑运算、短路求值特性、bool()函数用法以及隐式布尔转换规则。通过丰富的代码示例,帮助你掌握Python布尔类型的实际应用,写出更优雅的条件判断代码。
作者头像 智能小晨 python

Python复数类型complex详解

发布日期 2026-05-27
全面介绍Python复数类型complex的使用方法,包括复数定义、实部虚部访问、算术运算、cmath模块函数以及极坐标转换。掌握复数在科学计算和工程领域的应用。