You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:30:59