Python字符串比较(==)不起作用

9
为什么以下字符串比较不起作用? 我有以下代码(我修改了它以使其更简单)。 我从数据库中检索出一个玩家并将其添加到玩家列表中。 然后我循环遍历玩家列表并尝试找到它,即使字符串相同,比较也返回 false..
def findPlayer2(self, protocol, playerId):
    cur = self.conn.cursor()
    cur.execute("SELECT playerId, playerName, rating FROM players WHERE playerId LIKE (%s)", [playerId])
    nbResult = cur.rowcount
    result = cur.fetchone()
    cur.close()

    if nbResult > 0:
        player = Player(protocol, str(result[0]), str(result[1]), result[2])
        self.players.append(player)

    for player in self.players:
        id1 = str(player.playerId)
        id2 = str(playerId)
        print type(id1)
        print type(id2)
        print "Comparing '%s' with '%s'" % (id1, id2)

# HERE IS THE COMPARISON

        if id1 == id2:
            print "Equal! Player found!"
            return player
        else:
            print "Not equal :("

给出以下结果:

<type 'str'>
<type 'str'>
Comparing '11111111' with '11111111'
Not equal :(

13
使用 %r 代替 '%s'。可能存在一些不可打印的字符或相似字符。 - user395760
看起来你是对的,这是新的结果:将“11111111”与“11111111\x00”进行比较。你知道为什么会发生这种情况吗? - HLP
1
发送到函数的playerID类型是什么?使用的Python版本是哪个? - Loïc Faure-Lacroix
作为一个经常使用Bash的人,我的错误在于我在条件周围加上了[ ](facepalm表情),就像if [ str =="[]" ]一样。添加这个以防其他人需要。 - SidJ
2个回答

8
您似乎有一个字符串处理错误。PlayerId 似乎是存储在 Unicode 字符串中的 C-String。
背景:C 使用空字节 (\x00) 来标记字符串的结尾。由于这个空字节在您的字符串中,它最终出现在对象的字符串表示中。
您可以在这里查看一些参考资料。但是没有更多的代码,我不确定原因/修复方法。
您尝试过type(playerId)吗?
编辑:我不知道您使用的 Python 实现是什么,对于 CPython,请查看这里 不幸的是,我不太擅长在 C 和 Python 之间进行接口交互,但是您可以尝试在 C 端使用PyString_FromString将其转换为 Python 字符串或使用一些手工制作的函数(例如,在第一个未转义的 0 处使用正则表达式拆分)。
一些接口库列在这个答案中。

实际上,playerId是从C程序通过网络传输过来的。最好的方法是如何去除那个nullbyte终止符? - HLP
实际上,我只是在 C 端删除了最后一个字符。看起来可以工作。谢谢! - HLP
好的,我不确定你是否控制双方,但事实证明你确实有。无论如何,请查看PyString_FromString - ted

4
您可以这样删除任何非可打印字符
import string
player = ''.join(filter(lambda c: c in string.printable, player))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接