Python 中 is 与 == 操作有什么区别?

news/2024/7/20 14:39:29 标签: python, 面试, 内存管理

转自:https://foofish.net/what-is-difference-between-is-and-euqals.html

在 Python 中,比较两个对象(变量)是否相等,可以用 “is” 和 “==” 操作,但它俩有什么区别?什么时候用 “is”,什么时候用 “==” ?在面试时,发现不少候选人很难把这两者完全说清楚,因此在这篇文章中,「Python之禅」将对二者进行深入浅出的对比介绍。

先举个例子

小黄最近手头非常宽裕,花重金购买了一辆 P90D 特斯拉,我们暂且给这车取名叫 "小P" ,这辆车和隔壁老王家的车(车名叫 "小 王")是一模一样的,无论是型号、外表还是价格都一样,是同批次生产的。这里我们可以说 "小P" 和"小王"是两辆一模一样的、相等的(euqal),但本质上这是两个不同的对象。有一天小君给他的爱车又取了一个网名叫 "爱驹",当我们说 "小P" 的时候其实就是在讨论 "爱驹",因为本质上两个名字指的是同一个对象,这里我们把 "小P" 和 "爱驹" 称为完全相等的(identical)。

在 Python 中,”==” 和 “is” 的区别可类比这个例子 ,前者是相等性比较,比较的是两个对象中的值是否相等,后者是一致性比较,比较的是两个对象的内存空间地址是否相同。

​显然,如果内存地址相同,那么他们的值肯定也是一样的,因此,如果 “is” 返回 True,那么 “==” 一定也返回 True,反之却不成立。

talk is cheap, show me the code

先创建一个列表对象,然后给它指定一个名字 a,再定义另外一个变量 b,让它指向同一个对象。

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

a 和 b 打印的值都是相等的,因为这两个变量指向的是同一个对象,就好比给一辆车起了两个不同的名字。

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

理所当然, is 和 == 都返回 True。

>>> a == b
True
>>> a is b
True

创建一个新的对象,尽管值是一样的,但是他们本质上是两个不同的对象,处在两个不同的内存空间,因此 "is" 返回的是 False,但它们的值是相同的,所以 "==" 操作返回 True

>>> c = [1,2,3]
>>> a is c
False
>>> a == c
True

有且当仅比较的两个变量指向同一个对象时 "is" 才返回 True,而 "==" 最终取决于对象的 __eq__() 方法,本质上两个变量进行 "==" 比较操作调用的是对象的 __eq__() 方法。例如:

>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False

因为自定义类 Foo 的 eq 方法恒返回 True,因此它与任何对象进行 "==" 都是返回 True。而它与 None 是两个不同的对象,因此 'is' 操作返回的是 False。

最后请大家思考这段代码,为什么同样的操作会有不同的结果

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True
 
PS:
这就涉及到python内存管理机制了,python里面,所有变量都是对象,数据在内存中占用物理内存,然后指针的头指向不同的对象,就好比两台相同的电脑,编号却不一样,这其实是两个对象;但是也不是所有对象都是这样处理的,为了节省内存,对于小的整数和短的字符串,python在处理的时候会把相同的数据指向不同的对象,但它们的id是一样的。
 

转载于:https://www.cnblogs.com/linkxu1989/p/6691920.html


http://www.niftyadmin.cn/n/980922.html

相关文章

算法提高 盾神与砝码称重

算法提高 盾神与砝码称重 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述   有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已&…

Winform无边框窗体的移动和阴影

//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int IParam); public const int WM_SYSCOMMAND 0x0112; …

算法提高 素数求和

算法提高 素数求和 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 提交此题 问题描述   &#xfeff;输入一个自然数n&#xff0c;求小于等于n的素数之和 样例输入 2 样例输出 2 数据规模和约定   测试样例保证 2 < n < 2,000,000 此题如果使用一…

4-pwd 打印当前工作目录

pwd print name of current/working directory 打印当前工作目录 【语法】&#xff1a; pwd 【选项】 【参数】 【功能介绍】 pwd命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称&#xff08;从根目录&#xff09;写入标准输出。全部目录使用/分隔。第一…

算法提高 分苹果

算法提高 分苹果 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 提交此题 问题描述   小朋友排成一排&#xff0c;老师给他们分苹果。   小朋友从左到右标号1..N。有M个老师&#xff0c;每次第i个老师会给第Li个到第Ri个&#xff0c;一共Ri-Li1个小朋友每人发…

MySQL 双主 + keepalived 实现 HA

2个节点 (互为主从)1、MySQLSrv1 192.168.1.41 (MySQL主从节点)2、MySQLSrv2 192.168.1.42 (MySQL主从节点)VIP: 192.168.1.47软件版本说明&#xff1a;1、操作系统 CentOS6.6_x86_642、MySQLServer 5.6.33一、部署MySQL主从复制1、用户及相关目录创建--MySQLSrv1 节点[r…

JDBC操作mysql编写及遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> 一。例子来自于一本书上&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;public class MultiResultSe…

使用Xcode 查看objective-C的汇编代码

Xcode自带将某一个源文件转化成汇编的功能。如图&#xff1a; 汇编的部分代码例如以下&#xff1a; # Assembly output for assemble.c # Generated at 2:29:34 下午 on 星期一, 八月 18, 2014 # Using Debug configuration, x86_64 architecture for dataStruct target of dat…