使用 "is" 标识而不是“==”相等性检查对象是否在可迭代中
Check if object is in an iterable using "is" identity instead of "==" equality
if object in lst:
#do something
据我所知,当您执行此语句时,它会在内部检查 object
和 lst
中的每个元素之间的 ==
,这将引用 [=15] =] 这两个对象的方法。这可能意味着两个不同的对象是 "equal",如果它们的所有属性都相同,这通常是需要的。
但是,有没有一种方法可以通过 Python 方式实现诸如 in
之类的谓词,其中基础相等性检查是 is
- 即我们实际上是在检查两个引用是否指向同一对象?
使用any
函数:
if any(x is object for x in lst):
# ...
如果你想专门使用 is
那么只需使用像这样的过滤器:
filtered_list = filter(lambda n: n is object, list)
3list python 中的成员资格由 __contains__ dunder 方法决定。如果您想使用正常的“in
”语法,您可以选择覆盖自定义实现:
class my_list(list):
def __contains__(self, x):
for y in self:
if x is y:
return True
return False
4 in my_list([4, [3,2,1]])
>> True
[3,2,1] in my_list([4, [3,2,1]]) # Because while the lists are "==" equal, they have different pointers.
>>> False
否则,我会建议 kaya3 使用生成器检查的答案。
if object in lst:
#do something
据我所知,当您执行此语句时,它会在内部检查 object
和 lst
中的每个元素之间的 ==
,这将引用 [=15] =] 这两个对象的方法。这可能意味着两个不同的对象是 "equal",如果它们的所有属性都相同,这通常是需要的。
但是,有没有一种方法可以通过 Python 方式实现诸如 in
之类的谓词,其中基础相等性检查是 is
- 即我们实际上是在检查两个引用是否指向同一对象?
使用any
函数:
if any(x is object for x in lst):
# ...
如果你想专门使用 is
那么只需使用像这样的过滤器:
filtered_list = filter(lambda n: n is object, list)
3list python 中的成员资格由 __contains__ dunder 方法决定。如果您想使用正常的“in
”语法,您可以选择覆盖自定义实现:
class my_list(list):
def __contains__(self, x):
for y in self:
if x is y:
return True
return False
4 in my_list([4, [3,2,1]])
>> True
[3,2,1] in my_list([4, [3,2,1]]) # Because while the lists are "==" equal, they have different pointers.
>>> False
否则,我会建议 kaya3 使用生成器检查的答案。