将Unicode字符串转换为ascii字符串,然后将其与ascii字符串进行比较总是返回false。(Python 2.7.6)
这似乎是一个简单的问题,但我在任何地方都找不到答案 我有一个函数,它获取一个Unicode字符串作为参数,如下所示:将Unicode字符串转换为ascii字符串,然后将其与ascii字符串进行比较总是返回false。(Python 2.7.6),python,python-2.7,unicode,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 但
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
u=unicode('wxyz')
>>>s=str(u)
>>>a=u.encode('ascii')
>>>类型(u)
>>>类型
>>>类型(a)
>>>类型('wxyz')
>>>u是“wxyz”
假#应该是假
>>>u==“wxyz”
假#应该是假
>>>s是“wxyz”
假#应该是真的
>>>s=='wxyz'
真的#应该是真的
>>>a是“wxyz”
假#应该是真的
>>>a==“wxyz”
真的#应该是真的
>>>u是u'wxyz'
假#应该是真的
>>>u==u'wxyz'
真的#应该是真的
我想我可以将“is”改为“==”,但是我在代码中的其他地方都使用了“is”,而且切换到使用“==”似乎不是很像Python。如果有人能帮我理解这一点,我将非常感激。另外,如果你需要我更具体一些,请询问
如果有人问我这个问题,我深表歉意。我阅读了Unicode上的Python文档,并在这里查找了类似的问题,但我找不到任何回答我问题的答案。如果a和b绑定到同一个对象,则操作符
a is b
返回True。因此,is
在这里使用的运算符是错误的。这可能意味着您需要修复代码中使用的大部分位置
a = []
b = a
a is b # true
a == b # true
a = []
b = []
a is b # false
a == b # true
但是如果我做了
a='hello'
和b='hello'
,a是b
返回True。a和b不是绑定到不同的对象吗?@user2103760,试试a=906
b=906
a是b
,看看会发生什么。@user2103760:CPython从未承诺过它有时不会重用对象。当它们是不可变的时,这可以节省内存。例如,小整数对象经常被缓存——比较a=1;b=1;a是b,a=10000;b=10000;a是b
。是的,这将是编译器将不可变字符串对象作为优化重用OK。谢谢你回答我的问题!我想我现在明白了。