Chinaunix

标题: 为什么使用is比较str时有时是true,有时是false? [打印本页]

作者: mdou1986    时间: 2012-04-09 14:11
标题: 为什么使用is比较str时有时是true,有时是false?
>>> a="many"
>>> b="many"
>>> a is b
True
>>> a == b
True
>>> a="many paths"
>>> b="many paths"
>>> a==b
True
>>> a is b
False


我试了一下,中间有空格就是false,初学python,敢问为什么有这样的区别?
我使用的是python3.2.2
作者: anonymous0502    时间: 2012-04-09 14:35
这好像是工具问题吧,写在代码中没有这个问题的吧。
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-

  3. import sys


  4. def myprint(obj, end='\n'):
  5.     sys.stdout.write(str(obj) + end)


  6. def main():
  7.     a = 'many'
  8.     b = 'many'
  9.     myprint(a is b)

  10.     c = 'many paths'
  11.     d = 'many paths'
  12.     myprint(c is d)


  13. if __name__ == '__main__':
  14.     main()
  15.     myprint('done')
复制代码

作者: mdou1986    时间: 2012-04-09 15:29
看来是这样的,直接在IDLE中运行就是False,写在文件中就是True

十分感谢
作者: 3227049    时间: 2012-04-09 18:01
本帖最后由 3227049 于 2012-04-09 18:04 编辑

is相等指同一个对象(id相等), python有个interned池用来复用短字符窜, 所以会出现两个短字符窜is相当, 但是比较字符窜相等应该用==
作者: luoyan_xy    时间: 2012-04-09 23:00
学习了  :wink:
作者: mdou1986    时间: 2012-04-10 13:34
3227049 发表于 2012-04-09 18:01
is相等指同一个对象(id相等), python有个interned池用来复用短字符窜, 所以会出现两个短字符窜is相当, 但是 ...


是不是只有IDLE才会这么做呢?因为直接执行python语句的话返回的就都是False
作者: 3227049    时间: 2012-04-11 22:02
mdou1986 发表于 2012-04-10 13:34
是不是只有IDLE才会这么做呢?因为直接执行python语句的话返回的就都是False


也不一定的, 短的一般都是True, 经过操作后才会False
#coding:utf-8

import urllib.request as urllib

response = urllib.urlopen("http://www.baidu.com/").read().decode('gb18030')

response2 = response[:]

print (response is response2)
print (response  == response2)

response2 = (response2+"test")[:-4]

print (response is response2)
print (response == response2)


不过is的用途还是比较两个对象是否是同一个对象, 并不是比较两个对象是否相等, python出现两个不同字符窜is相等是本身的字符窜缓存机制的作用, 比较字符窜上还是应该用==
作者: mdou1986    时间: 2012-04-14 10:58
3227049 发表于 2012-04-11 22:02
也不一定的, 短的一般都是True, 经过操作后才会False


恩,知道了,十分感谢




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2