Python 如何使用identity而不是equality来测试元素是否在列表中?
在Python中,我可以测试元素是否在如下列表中:Python 如何使用identity而不是equality来测试元素是否在列表中?,python,python-3.x,Python,Python 3.x,在Python中,我可以测试元素是否在如下列表中: elem = 56 long_list = ["foo", "bar", asdf, 56, False] print(elem in long_list) # "True" 这相当于: elem = 56 long_list = ["foo", "bar", asdf, 56, False] result = False for candidate in long_list: if elem == candidate:
elem = 56
long_list = ["foo", "bar", asdf, 56, False]
print(elem in long_list) # "True"
这相当于:
elem = 56
long_list = ["foo", "bar", asdf, 56, False]
result = False
for candidate in long_list:
if elem == candidate:
result = True
break
print(result) # "True"
注意elem==candidate
,它测试相等性
我想做的是使用elem is candidate
测试身份。在Python中,最简单的方法是什么
我试过谷歌,但不幸的是,“是”和“在”这两个词太常见了。我也试过了
print(elem is in long_list)
但这给了我一个语法错误。使用
any
和:
如果要比较的元素在
is
方面实现\uuuu eq
,您只需使用长列表中的元素即可,它将自动为您调用。因此,这应该适用于您的对象:
def __eq__(self, x):
return self is x
为了简单起见,这里有一个小演示,它将等式重载为str.startswith
(第二个操作数的)而不是identity
>>> class permissive(str):
def __eq__(self, x):
return self.startswith(x)
>>> mylist = map(permissive, [ "hip", "hop" ])
>>> "hi" in mylist
True
当然,在其他上下文中比较对象是否相等时,也会得到同样的超严格行为。如果你的目标只是在列表中找到一个特定的对象,也许你应该定义\uuuuuuhash\uuuuu
,并将它们存储在字典中?我可能误解了这个问题,但是如果一个对象没有实现\uuuueq\uuu
,中的和=
默认的身份比较,这就是你想要的
class Foo:
pass
a = Foo()
b = Foo()
c = Foo()
print (a in [a,b]) # True
print (c in [a,b]) # False
我确实想使用is
而不是=
,但原因比这里给出的要复杂。我说“我正在比较那些没有实现\uuuueq\uuuuuu
”的对象以保持简单,但看起来我已经被发现了;)我已经删除了这个声明,因为它显然是在转移视线。您的实际用例是什么?我想我从来都不需要这个。
class Foo:
pass
a = Foo()
b = Foo()
c = Foo()
print (a in [a,b]) # True
print (c in [a,b]) # False