将Unicode字符串转换为ascii字符串,然后将其与ascii字符串进行比较,始终返回false。 (Python 2.7.6)

时间:2013-11-25 02:09:11

标签: python python-2.7 unicode

这似乎是一个简单的问题,但我无法在任何地方找到答案。

我有一个函数,它将Unicode字符串作为参数,如下所示:

def foo(arg):
    if str(arg) is 'wxyz':
        print 'it is equal'

鉴于输入u'wxyz',该函数不会打印任何内容。我做了一些测试,我提出了一个问题。

为什么这不起作用:

>>> u = unicode('wxyz')
>>> str(u) is 'wxyz'
False

但这确实有效:

>>> str(u) == 'wxyz'
True

这是我已经尝试过的:

>>> u = unicode('wxyz')
>>> s = str(u)
>>> a = u.encode('ascii')
>>> type(u)
<type 'unicode'>
>>> type(s)
<type 'str'>
>>> type(a)
<type 'str'>
>>> type('wxyz')
<type 'str'>
>>> u is 'wxyz'
False             # Should be False
>>> u == 'wxyz'
False             # Should be False
>>> s is 'wxyz'
False             # Should be True
>>> s == 'wxyz'
True              # Should be True
>>> a is 'wxyz'
False             # Should be True
>>> a == 'wxyz'
True              # Should be True
>>> u is u'wxyz'
False             # Should be True
>>> u == u'wxyz'
True              # Should be True

我想我可以将'is'更改为'==',但我一直在使用'is'代码中的其他地方,并且它似乎不会像Python那样转换为使用' ==”。如果有人能帮助我理解这一点,我会非常感激。另外,如果您需要我更具体,请询问。

如果在其他地方被问到这个问题我真的很抱歉。我阅读了关于Unicode的Python文档,并在这里查找了类似的问题,但我找不到任何能回答我问题的内容。

1 个答案:

答案 0 :(得分:2)

如果a和b 绑定到同一个对象,则运算符a is b返回True。所以is是在这里使用的错误操作符。这可能意味着您需要修复代码中使用is的大多数地方。

a = []
b = a
a is b # true
a == b # true

a = []
b = []
a is b # false
a == b # true