Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用identity而不是equality来测试元素是否在列表中?_Python_Python 3.x - Fatal编程技术网

Python 如何使用identity而不是equality来测试元素是否在列表中?

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:

在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:
        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