在Python中使用is
检查空字符串是否正确?它进行身份检查,而==
测试相等。
请考虑以下事项(使用join
的想法来自this answer):
>>> ne1 = "aaa"
>>> ne2 = "".join('a' for _ in range(3))
>>> ne1 == ne2
True
>>> ne1 is ne2
False
>>>
所以这里is
可以正常运作。现在看一下这段代码:
>>> e1 = ""
>>> e2 = "aaa".replace("a", "")
>>> e3 = "" * 2
>>> e4 = "bbb".join(range(0))
>>> e1, e2, e3, e4
('', '', '', '')
>>> e1 is e2
True
>>> e1 is e3
True
>>> e1 is e4
True
>>> id(e1), id(e2), id(e3), id(e4)
(35963168, 35963168, 35963168, 35963168) # why?
答案 0 :(得分:15)
检查空字符串的正确方法是:
if yourstring:
print "string is not empty"
e.g。如果您的字符串为空,bool(yourstring)
将为False
。您的示例工作的原因是因为CPython缓存某些字符串和整数并重用它们以提高效率。这是一个实现细节,不应该依赖它。
答案 1 :(得分:8)
Python实现可能会选择实习小字符串(好吧,它可能会选择实际生成任何不可变的内容); Cpython就这样做了。
你永远不应该依赖这种行为。如果要检查字符串是否为空字符串,请始终使用mystring == ""
。
如果你确定你正在检查的对象总是一个字符串,你也可以在布尔上下文中评估它(例如,if mystring:
),但请记住,这不会区分空来自0
,False
或None
的字符串。
答案 2 :(得分:1)
检查空序列(字符串,列表,...)的最佳方法是:
if variable:
pass
以下值被视为false:
任何空序列,例如'',(),[]
另请阅读有关comparison的文档:
is
比较身份==
根据类型使用数字等价物按字典顺序比较字符串 (字符的内置函数ord())的结果。 Unicode和8位字符串在此行为中完全可互操作
答案 3 :(得分:0)
如果指向同一个对象,则“is”运算符返回true,因为python尝试不重复字符串(它检查这些字符串是否已经存在于内存中),它将返回相同的对象。
我不会使用“is”来比较字符串,它就像Java中的“==”运算符,它通常可以工作,但也许你可以得到新的实例并且它将返回false,我更喜欢使用==它会调用方法 eq ,如果两个字符串都是等号,则返回True,即使它们是不同的对象。