将Unicode字符串转换为ascii字符串,然后将其与ascii字符串进行比较,总是返回false.(Python 2



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

我有一个函数,它获取一个Unicode字符串作为参数,看起来像这样:

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

给定输入u'xyz',函数不会打印任何内容。我又做了一些测试,我提出了一个问题。

为什么这不起作用:

>>> 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文档,并在这里寻找类似的问题,但我找不到任何能回答我问题的东西。

如果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