python 3.4 涉及字节文字的条件 returns false 而不是 true

python 3.4 condition involving byte literal returns false instead of true

我使用 python 3.4 和 pymysql 连接到 MySQL 数据库。我有一个 select 查询,然后将 returns 结果全部提取到 r[] 中。 r[0] 只是结果元组的第一部分,它的值是一个空字符串(因为它应该基于数据库中的内容。)

然而,当我使用条件时:

if str(r[0]) == ''.encode('utf8'):
        do something...

条件计算结果为假,而不是我期望的结果!我通过打印出零件的值来测试它以找出原因:

    print(str(r[0]))
    print(''.encode('utf8')) 
    print(str(r[0]) == ''.encode('utf8'))  

这会打印:

b''
b''
False

知道为什么吗?这让我抓狂,因为它不应该这么难。我错过了什么?

您正在比较字节和 unicode,这必然会在 Python 中与 False 进行比较 3. 一些参考资料:

http://scikit-bio.org/docs/0.1.3/development/py3.html#gotchas

http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/

解决方案是不要在右侧的空字符串上调用 encode()

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> str(r[0]) == ''
True

如您所见,encode()str 对象上的结果是字节:

>>> x = ''.encode('utf8')
>>> type(x)
<class 'bytes'>