Python 身份运算符详解 | is 与 == 到底差在哪

案例需求

有如下三个变量:

python 复制代码
num1 = 1000
num2 = int("1000")
num3 = num1

它们"看起来"都是 1000。编写程序回答下面问题:

  1. 用 == 运算符判断 num1 和 num2 的值相等吗?
  2. 用 is 运算符判断 num1 和 num2 是同一个对象吗?
  3. 用 is 运算符判断 num1 和 num3 是同一个对象吗?
  4. 用 is 运算符判断 num1 和 num2 不是同一个对象吗?
  5. 定义一个值是 None 的变量 result,判断它"是不是 None"?

案例实现

第 1 步 :定义三个变量,给它们分别赋值。其中 int("1000") 会把字符串 "1000" 变成一个新的整数对象。

python 复制代码
num1 = 1000
num2 = int("1000")
num3 = num1

第 2 步 :用 == 判断"值"是否相等,用 is 判断"是不是同一个对象"。

python 复制代码
print("num1 与 num2 的值相等吗(==)?      ", num1 == num2)
print("num1 与 num2 是同一个对象吗(is)?  ", num1 is num2)
print("num1 与 num3 是同一个对象吗(is)?  ", num1 is num3)
print("num1 与 num2 不是同一个对象吗?      ", num1 is not num2)

第 3 步 :None 表示"什么都没有"。判断一个变量是不是 None,标准写法是用 is 运算符。

python 复制代码
result = None
print("result 是 None 吗(用 is 判断)?    ", result is None)
print("result 的值等于 None 吗(用 == 判断)?", result == None)

完整代码:

python 复制代码
num1 = 1000
num2 = int("1000")
num3 = num1

print("num1 与 num2 的值相等吗(==)?      ", num1 == num2)
print("num1 与 num2 是同一个对象吗(is)?  ", num1 is num2)
print("num1 与 num3 是同一个对象吗(is)?  ", num1 is num3)
print("num1 与 num2 不是同一个对象吗?      ", num1 is not num2)

result = None
print("result 是 None 吗(用 is 判断)?    ", result is None)
print("result 的值等于 None 吗(用 == 判断)?", result == None)

运行结果:

复制代码
num1 与 num2 的值相等吗(==)?       True
num1 与 num2 是同一个对象吗(is)?   False
num1 与 num3 是同一个对象吗(is)?   True
num1 与 num2 不是同一个对象吗?       True
result 是 None 吗(用 is 判断)?     True
result 的值等于 None 吗(用 == 判断)? True

案例解析

  • == 比较"内容",is 比较"身份" :变量可以看成一个个的盒子。== 打开盒子比"里面装的 1000 一样不一样";is 不看内容,只问"这两个名字指的是不是同一个盒子"。
  • 为什么 num1 is num2 是 False :num1 = 1000 直接得到一个盒子;num2 = int("1000") 是调用函数新建 了一个盒子,虽然里面的值也是 1000,但盒子不是同一个,所以 is 为 False。
  • 为什么 num1 is num3 是 True :num3 = num1 只是把 num1 这个"盒子的名字"又写了一遍,两个名字指向同一个盒子,所以 is 为 True。
  • 用 is 运算符判断 None :None 在 Python 里只有一个,所以判断一个变量是不是 None,查的就是"身份"。规范写法是 data is None,反过来写就是 data is not None。
  • 不要用 is 去判断两个数字或字符串是否相等。两个值相等的数字,is 有时是 True 有时是 False(取决于 Python 内部的缓存策略),容易写出"时好时坏"的程序;想比是否相等就用 ==,只有判身份才用 is。

相关练习

一、题目

1.(选择题) 关于 is 和 ==,下列说法正确的是(  )。

  • A. is 比较两个值是否相等
  • B. == 比较两个变量是不是同一个对象
  • C. is 比较两个变量是不是同一个对象
  • D. 两者完全一样,随便用哪个都行

2.(填空题) 判断变量 data 是不是 None,推荐写成 data ________ None(填写运算符)。

3.(判断题) 如果两个变量用 == 比较的结果是 True,那么它们用 is 比较的结果也一定是 True。(  )

4.(简答题) 已知 num1 = 1000、num2 = int("1000"),请分别写出"比较二者值是否相等"和"比较二者是否为同一个对象"的两个表达式,并说明运行结果。

二、参考答案与解析

1. 答案:C

解析:is 是身份运算符 ,比较两个变量是否指向同一个对象;== 是比较运算符,比较两个值是否相等。两者作用不同,不能混用。

2. 答案:is

解析:None 在整个 Python 里只有一个,判断它用身份运算符最准确,规范写法是 data is None。

3. 答案:错误(×)

解析:值相等不代表是同一个对象。例如 num1 == num2 为 True,但 num1 is num2 为 False,两个盒子里的内容一样,盒子本身却不是同一个。反过来,如果 is 为 True,那么 == 一定也为 True。

4. 答案:num1 == num2 为 True;num1 is num2 为 False

解析:比较值相等写 num1 == num2,结果是 True;比较是否为同一个对象写 num1 is num2,结果是 False。因为 num2 是用 int("1000") 现场新造出来的对象,虽然值相同,但和 num1 不是同一个。

声明:本文部分内容由人工智能辅助生成。

相关推荐
fengye2071611 小时前
cpython框架结构
python
用户91294046848421 小时前
大模型返回 JSON 后,先过这道 Python 校验
python
Dmz丶1 小时前
前端转 AI 100 天 Day 32:LLM 客户端工程化——重试、超时、降级、限流
python
曲径海盗2 小时前
【Python 学习第 39 天】for 循环
python·学习笔记·编程入门
万联WANFLOW2 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
问心无愧05133 小时前
[护网杯 2018]easy_tornado
python·tornado
全栈弄潮儿3 小时前
Python实战第13期:模块与包
后端·python·编程语言
2401_885885043 小时前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别
Dev _4 小时前
Python解释器安装在系统级目录导致命令行用户‌没有权限‌向该目录写入文件
开发语言·python