python如何⽐较字符串是否⼀样
在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判断。
python字符串判断相等总结
判断字符串相等使⽤==,不使⽤is和cmp()函数
cmp() 函数则是相当于 <,==,> 但是在 Python3 中,cmp() 函数被移除了,所以我以后还是避免少⽤这个函数。
#-*-conding:utf-8-*-
i='新闻';
m=input();
if i==m:
print('yes');
else:
print('no');
if second_company_name == u'中外运长航' or second_company_name == u'长航集团':
print(u'忽略中外运长航和长航集团的⼦公司')
continue
在 if 判断语句中⾮常有⽤呐!
#!/usr/bin/python
# Filename: if.py
number = 23
guess = int(raw_input('Enter an integer : '))
if guess == number:
print 'Congratulations, you guessed it.' # New block starts here
print "(but you do not win any prizes!)" # New block ends here
elif guess < number:
print 'No, it is a little higher than that' # Another block
# You can do whatever you want in a block ...
else:
print 'No, it is a little lower than that'
# you must have guess > number to reach here
print 'Done'
# This last statement is always executed, after the if statement is executed```
## strip 去掉字符串其他符号
str1 = str1.strip() #去掉字符串中其他符号包括换⾏符等等
str2 = str2.strip()
if str2 == str1:
... #⾃⼰的代码
## == 与 is的区别
python中,使⽤==来⽐较两个**对象的值**是否相等,⽽java 则使⽤== ⽐较两个**对象**是否是同⼀对象譬如,java中⽐较字符串,⼀般使⽤equal ⽅法,来⽐较两个对象的值是否相等,⽽不使⽤==
相⽐较的,python 使⽤**is** 来⽐较两个对象是否是同⼀对象。
is ⽤来判断是否是同⼀个对象,is 是种很特殊的语法,你在其它的语⾔应该不会见到这样的⽤法。
官⽅⽂档解释:
```python
The operators ``is`` and ``is not`` test for object identity: ``x is
y`` is true if and only if *x* and *y* are the same object. ``x is
not y`` yields the inverse truth value.
cmp(...)
cmp(x, y) -> integer
Return negative if x<y, zero if x==y, positive if x>y.
注意:内容相同的字符串实际上是同⼀个对象
>>> a='abc'
>>> b='abc'
>>> a is b
True
>>> id(a) == id(b)
True
>>>
>```
(Java 中直接赋值的字符串也可⽤ == 来判断,但是使⽤ new 实例化的对象则需要使⽤equals(String s) 来判断)
## 判断数字相等不要⽤ is 操作符
```python
>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
>>> id(b)
11662828
为什么两次 is 返回的是不同结果?不是应该都是 true 吗?
因为 string pooling (或叫intern)。 is 相等代表两个对象的 id 相同(从底层来看的话,可以看作引⽤同
⼀块内存区域)。⾄于为什么 “ABC” 被 intern 了⽽ “a bc” 没有,这是 Python 解析器实现决定的,可能会变。
== ⽤来判断两个对象的值是否相等(跟 Java 不同,Java 中 == ⽤来判断是否是同⼀个对象)。
今天我⽤ == 来判断两个 IP 地址字符串是否相同。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论