使用`is`检查空字符串

kha*_*hik 1 python identity equals

is在Python中检查空字符串是否正确?它进行身份检查,同时==测试相等性.

考虑以下(使用的想法join是从这个答案借来的):

>>> ne1 = "aaa"
>>> ne2 = "".join('a' for _ in range(3))
>>> ne1 == ne2
True
>>> ne1 is ne2
False
>>>
Run Code Online (Sandbox Code Playgroud)

所以这里的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?
Run Code Online (Sandbox Code Playgroud)

mgi*_*son 15

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

if yourstring:
   print "string is not empty"
Run Code Online (Sandbox Code Playgroud)

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

  • 这不仅仅是一个学术问题.PyPy在这里的表现不像CPython:`a =''; b ='a'[:0]; a是b`是假的.实际上,是否`''`````甚至可以依赖于PyPy控制台来判断你是否把所有东西放在一行上:`a =''; b =''; a是b`在一行上给出'True`,并且'False'在三行上展开. (4认同)

Woo*_*ble 8

Python实现可以选择实习小字符串(好吧,它可以选择实际上实现任何不可变的); Cpython这样做了.

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

如果你确定你正在检查的对象始终是一个字符串,也可以评价它在布尔上下文(例如if mystring:),但请记住,这将不会从区分空字符串0,FalseNone.

  • 应该指出的是,`mystring ==""`并不能保证你有一个空字符串(考虑你有一个类覆盖`__eq__`的情况).有关python的一点是它*(通常)无关紧要*是否有字符串.如果你真的想确保你有一个字符串(并且它是空的),也许`""== mystring`可以工作(因为它在`````而不是`__eq__`上使用`__eq__`)甚至` isinstance(mystring,basestring)和mystring ==''`更加明确. (2认同)