python 比较字符串是否一样

python 比较字符串是否一样在python中,判断两个变量是否相等或一样,可以使用==或者is来判断;判断不一样可以使用isnot。示例1.有时候两个字符串打印出来看着一样,但是判断却是False?如果两个字符串末尾有其他符号,比如回车‘\n’,print的时候无法发现的,所以需要strip:a=a.strip()b=b.strip()ifa==b: print"True"2.有时候==判断是Tr…

大家好,又见面了,我是你们的朋友全栈君。

python中,判断两个变量是否相等或一样,可以使用==或者is来判断;判断不一样可以使用 is not。

示例
在这里插入图片描述

使用注意事项

1.有时候两个字符串打印出来看着一样,但是判断却是False?如果两个字符串末尾有其他符号,比如回车‘\n’,print的时候无法发现的,所以需要strip:

a=a.strip()
b=b.strip()
if a==b:
	print "True"

2.有时候==判断是 True ,is 判断却是 False?
这是因为两个字符串来自不同的内存块,内存地址不一样

id() 函数用于获取对象的内存地址。
(ob1 is ob2) 等价于 (id(ob1) == id(ob2)) id函数可以获得对象的内存地址,如果两个对象的内存地址是一样的,那么这两个对象肯定是一个对象。和is是等价的.
在这里插入图片描述

3.还有一种情况是两个对象用is判断是False,用id判断却是True。原理比较复杂,如下:

In [1]: def bar(self, x):
...:     return self.x + y
...: 

In [2]: class Foo(object):
...:     x = 9
...:     def __init__(self ,x):
...:         self.x = x
...:     bar = bar
...:     

In [3]: foo = Foo(5)

In [4]: foo.bar is Foo.bar
Out[4]: False

In [5]: id(foo.bar) == id(Foo.bar)
Out[5]: True

真实情况是当执行.操作符的时候,实际是生成了一个proxy对象,foo.bar is Foo.bar的时候,两个对象顺序生成,放在栈里相比较,由于地址不同肯定是False,但是id(foo.bar) ==id(Foo.bar)的时候就不同了,首先生成foo.bar,然后计算foo.bar的地址,计算完之后foo.bar的地址之后,就没有任何对象指向foo.bar了,所以foo.bar对象就会被释放。然后生成Foo.bar对象,由于foo.bar和Foo.bar所占用的内存大小是一样的,所以又恰好重用了原先foo.bar的内存地址,所以id(foo.bar) == id(Foo.bar)的结果是True。
下面内容由邮件Leo Jay大牛提供,他解释的更加通透。

用id(expression a) == id(expression b)来判断两个表达式的结果是不是同一个对象的想法是有问题的。

foo.bar 这种形式叫 attribute reference [1],它是表达式的一种。foo是一个instance object,bar是一个方法,这个时候表达式foo.bar返回的结果叫method object [2]。根据文档:

When an instance attribute is referenced that isn’t a data attribute,
its class is searched. If the name denotes a valid class attribute
that is a function object, a method object is created by packing
(pointers to) the instance object and the function object just found
together in an abstract object: this is the method object.

foo.bar本身并不是简单的名字,而是表达式的计算结果,是一个 method object,在id(foo.bar)这样的表达式里,method object只是一个临时的中间变量而已,对临时的中间变量做id是没有意义的。
一个更明显的例子是,

print id(foo.bar) == id(foo.__init__)  输出的结果也是True

看 id 的文档[3]:

Return the “identity” of an object. This is an integer (or long
integer) which is guaranteed to be unique and constant for this object
during its lifetime. Two objects with non-overlapping lifetimes may
have the same id() value. CPython implementation detail: This is the
address of the object in memory.

只有你能保证对象不会被销毁的前提下,你才能用 id 来比较两个对象。所以,如果你非要比的话,得这样写:

fb = foo.bar 
Fb = Foo.bar 
print id(fb) == id(Fb)

即把两个表达式的结果绑定到名字上,再来比是不是同一个对象,你才能得到正确的结果。

is表达式 [4] 也是一样的,你现在得到了正确的结果,完全是因为 CPython 现在的实现细节决定的。现在的is的实现,是左右两边的对象都计算出来,然后再比较这两个对象的地址是否一样。万一哪天改成了,先算左边,保存地址,把左边释放掉,再算右边,再比较的话,你的is的结果可能就错了。官方文档里也提到了这个问题 [5]。我认为正确的方法也是像id那样,先把左右两边都计算下来,并显式绑定到各自的名字上,然后再用is判断。

参考:https://blog.csdn.net/weixin_32820767/article/details/82320914

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150477.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • request对象、response对象、session对象

    request对象、response对象、session对象仅仅是一些简单知识点的罗列,当做笔记,想具体学习的话,还是要找专业的书籍看看request对象作用:获取用户提供的信息语法:是实现了ServletRequest接口类的一个实例使用表单向服务器的某个JSP页面提交信息常用方法:设置编码方式:例如(用来防止汉字乱码)request.setCharacterEncoding(“gb2312”);同效果:Stringstr=r…

  • linux PS1 提示符定义[通俗易懂]

    linux PS1 提示符定义[通俗易懂]PS1:就是用户平时的提示符。PS2:第一行没输完,等待第二行输入的提示符。Linux系统提示符是用系统变量PS1来定义的。一般系统默认的形式是:[username@host工作目录]$.用e

  • SfM问题

    SfM问题StructurefromMotion(SfM)是一个估计相机参数及三维点位置的问题。SfM也就是三维重建

  • 最小二乘法曲线拟合以及Matlab实现

    最小二乘法曲线拟合以及Matlab实现最小二乘法曲线拟合以及Matlab实现在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。目录最小二乘法直线拟合原理曲线拟合Matlab实现代码最小二乘法直线线拟合原理首先,我们从曲线拟合的最简单情况——直线拟合来引……

  • 虚拟机安装中标麒麟系统_虚拟机安装中标麒麟7

    虚拟机安装中标麒麟系统_虚拟机安装中标麒麟7首先,到这里下载中标麒麟6.0桌面版,大小约3.6G:http://pan.baidu.com/s/1bnGlSsv 中标麒麟为NeoKylin,和原先的红旗Linux一样,国产化的Linux;而另一个ubuntukylin叫“优麒麟”,为ubuntu中文化版本。这里的工具还用到了虚拟机VBOX(VirtualBox)、putty远程终端连接工具、cuteftp或者WinSCP类似

  • 数据库中去重_mysql数据去重

    数据库中去重_mysql数据去重数据库中如何去重:数据库中去重,需要分五步走一、找出重复值清单,利用distinct或groupby的方式将重复值清单取出二、将没有重复值的数据利用createtabletable_nameas步骤一中的查询语句三、将原表中数据利用truncatetabletable_name;的方式清空四、利用insertintotableselect*from无重复数据的表中五、将刚刚建立的表清掉即可推荐一个学习数据库,python,linux干货比较多的公众号:“数据与编程

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号