首页 > 解决方案 > 为什么 Python 字符串无法正确比较?

问题描述

我正在比较 Python 中的两个字符串。但是比较看不出变量的值firmwarehardware字符串"firmware""hardware“.

gfirmware = create_string_buffer(str.encode("firmware"), 100)
ghardware = create_string_buffer(str.encode("hardware"), 100)
firmware = str(gfirmware,'utf-8')
hardware = str(ghardware,'utf-8')

print('firmware var = ' + firmware)
print('hardware var = ' + hardware)
print("\n")
print('firmware type = ' + str(type(firmware)))
print('hardware type = ' + str(type(hardware)))
print('"firmware" type = ' + str(type("firmware")))
print('"hardware" type = ' + str(type("hardware")))

print("Is it true? " + str(firmware != "firmware" and hardware != "hardware"))

输出:

firmware var = firmware
hardware var = hardware

firmware type = <class 'str'>
hardware type = <class 'str'>
"firmware" type = <class 'str'>
"hardware" type = <class 'str'>
Is it true? True

从输出中可以看出,变量和字符串的值和类型相同。

那么为什么比较firmware != "firmware" and hardware != "hardware"返回True,它应该返回False呢?

注意: 我有意使用create_string_buffer(),因为我正在传递gfirmwareghardware进入 C 函数。但是即使我没有将变量传递给 C 函数,也会出现这个问题。

我看过以下和其他帖子,但他们的问题是程序员is在他们应该使用==.

为什么使用 '==' 或 'is' 比较字符串有时会产生不同的结果?

python无法比较字符串

比较 unicode 对象和字符串对象时的奇怪行为

标签: python-3.xstring-comparison

解决方案


gfirmwareghardware对象是大型字符缓冲区。当您将它们转换为字符串时,str(gfirmware,'utf-8')您会得到大字符串:

>>> len(str(gfirmware, 'utf-8'))
100

因为你仍然有所有的填充。

您可以value在转换为字符串之前在缓冲区上使用该属性:

>> firmware = str(gfirmware.value,'utf-8')
>> hardware = str(ghardware.value,'utf-8')
>> firmware != "firmware", hardware != "hardware"
(False, False)

推荐阅读