使用`is`检查空字符串

时间:2012-09-04 12:29:53

标签: python equals identity

在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?

4 个答案:

答案 0 :(得分:15)

检查空字符串的正确方法是:

if yourstring:
   print "string is not empty"

e.g。如果您的字符串为空,bool(yourstring)将为False。您的示例工作的原因是因为CPython缓存某些字符串和整数并重用它们以提高效率。这是一个实现细节,不应该依赖它。

答案 1 :(得分:8)

Python实现可能会选择实习小字符串(好吧,它可能会选择实际生成任何不可变的内容); Cpython就这样做了。

你永远不应该依赖这种行为。如果要检查字符串是否为空字符串,请始终使用mystring == ""

如果你确定你正在检查的对象总是一个字符串,你也可以在布尔上下文中评估它(例如,if mystring:),但请记住,这不会区分空来自0FalseNone的字符串。

答案 2 :(得分:1)

检查空序列(字符串,列表,...)的最佳方法是:

if variable:
  pass

来自Truth Value Testing

  

以下值被视为false:

     

任何空序列,例如'',(),[]

另请阅读有关comparison的文档:

  • is比较身份
  • ==根据类型
  • 比较相等性
  

使用数字等价物按字典顺序比较字符串   (字符的内置函数ord())的结果。   Unicode和8位字符串在此行为中完全可互操作

答案 3 :(得分:0)

如果指向同一个对象,则“is”运算符返回true,因为python尝试不重复字符串(它检查这些字符串是否已经存在于内存中),它将返回相同的对象。

我不会使用“is”来比较字符串,它就像Java中的“==”运算符,它通常可以工作,但也许你可以得到新的实例并且它将返回false,我更喜欢使用==它会调用方法 eq ,如果两个字符串都是等号,则返回True,即使它们是不同的对象。