Python if语句未检测到Unicode破折号

Python if语句未检测到Unicode破折号,python,python-2.7,unicode,Python,Python 2.7,Unicode,使用python 2.7.11 我正在读取的utf-8文档中的破折号被用于检测破折号的if语句忽略。仪表板以“-”字符的形式打印到控制台,当显示为表示时,显示为u“-”。通过ord()传递的字符显示序号45,与破折号字符相同 segment = line[:section_widths[row_index]].strip() line = line[section_widths[row_index]+1:] if segment: print 'seg' if segment i

使用python 2.7.11

我正在读取的utf-8文档中的破折号被用于检测破折号的if语句忽略。仪表板以“-”字符的形式打印到控制台,当显示为表示时,显示为u“-”。通过ord()传递的字符显示序号45,与破折号字符相同

segment = line[:section_widths[row_index]].strip()
line = line[section_widths[row_index]+1:]
if segment:
    print 'seg'
    if segment is u'-' or segment is '-':
        print 'DASH DETECTED'
        continue
    print "ord %d" % ord(segment[0])

事实证明,Python2.7.x的“is”对unicode字符串的效果与对ASCII字符串的效果不同。这里主要解释了这种区别:[]

每个unicode字符串都是一个对象,该对象与用于unicode文本的对象不同

>>> uni = unicode('unicode')
>>> uni == 'unicode'
True
>>> uni is 'unicode'
False
>>> 
>>> asc = str('ascii')
>>> asc == 'ascii'
True
>>> asc is 'ascii'
True
编辑:

正如马克·托洛宁所指出的,这是不一致的行为

>>> x=1
>>> x is 1
True
>>> x=10000
>>> x is 10000
False
(在Python 2.7.11 | Anaconda 2.4.0(x86_64)|(默认,2015年12月6日,18:57:58)[GCC 4.2.1(Apple Inc.build 5577)]达尔文版上运行)

不用于等式检查。使用
==
进行相等性检查

>>> 'stringstringstringstringstring' == 'string' * 5
True
>>> 'stringstringstringstringstring' is 'string' * 5
False

应该用于身份检查。

我认为这应该是字符45(Unicode称之为“连字符减号”),而不是,例如EN-DASH(u+2013)或EM-DASH(u+2014)。是的,原始文本是“连字符减号”字符,尽管在文档中它被用作占位符,很像一个椭圆,不要依赖它。Python实现可以自由缓存不可变的对象,但不必这样做。尝试
x=1
然后
x是1
x=10000
然后
x是10000
。在CPython上,第一个可能是真的,第二个可能是假的。
>>> 'stringstringstringstringstring' == 'string' * 5
True
>>> 'stringstringstringstringstring' is 'string' * 5
False