Python中Filter方法过滤字符串不符合预期:is not失效但!=正常
为什么用
is not过滤字符串列表不生效,而!=可以? 核心原因是is not和!=的判断逻辑完全不同:
is not比较的是对象的身份(内存地址),只有当两个变量指向同一个内存对象时,is才会返回True,反之is not返回True。!=比较的是对象的值是否相等,只要两个对象的内容一致,就会返回False(对应x != "foo-bar"的判断逻辑,值相等时条件不成立)。
结合你的代码来看:
list_of_strings = ["foo-bar", "foo", "bar"] print(list(filter(lambda x: x is not "foo-bar", list_of_strings)))
Python的字符串驻留(intern)机制只会对部分简单字符串生效(比如不含特殊符号的短字符串),像"foo-bar"这种带-的字符串,列表中存储的实例和你在lambda里写的字面量实例,可能是两个不同的内存对象。这时候x is not "foo-bar"对列表里的"foo-bar"元素来说会返回True,导致它被保留在过滤结果中,不符合你的预期。
而换成!=时,只校验值是否相等:
print(list(filter(lambda x: x != "foo-bar", list_of_strings)))
列表里的"foo-bar"和字面量的值完全一致,所以x != "foo-bar"返回False,这个元素就被过滤掉,得到你想要的结果。
你可以用id()函数验证对象身份的差异:
list_of_strings = ["foo-bar", "foo", "bar"] print(id(list_of_strings[0])) # 列表中元素的内存地址 print(id("foo-bar")) # 字面量的内存地址 print(list_of_strings[0] is "foo-bar") # 输出False,说明不是同一个对象
内容的提问来源于stack exchange,提问作者Abinash Biswal
相关产品推荐
相关产品推荐

