Python—如何知道项目是否引用列表的指定元素
我有两个列表Python—如何知道项目是否引用列表的指定元素,python,list,Python,List,我有两个列表A=[1,1,1]和B=[1],它们都包含元素1 如果无意中发现任何1,是否有办法知道该1是否引用了B中的第0个元素,例如: a = A[0] b = B[0] # <-- This is refering to B at index 0 print(a is B[0], id(a) == id(B[0])) # this should return false print(b is B[0], id(b) == id(B[0])) # this should return
A=[1,1,1]
和B=[1]
,它们都包含元素1
如果无意中发现任何1
,是否有办法知道该1
是否引用了B
中的第0个元素,例如:
a = A[0]
b = B[0] # <-- This is refering to B at index 0
print(a is B[0], id(a) == id(B[0])) # this should return false
print(b is B[0], id(b) == id(B[0])) # this should return true
print(1 is B[0]) # this should also return false
我想特别知道的是,某个东西是否引用了列表的某个元素,换句话说,在上面的示例中,该函数只在第二种情况下返回True。在您的示例中,当变量指向同一个对象时,它将始终是
True
。
如果您必须区分两个“相等”的整数,您可以做的是为其实现一个包装器类。默认情况下,类实例的标识将不同,比较将失败
例如:
class CustomInt:
def __init__(self, number):
self.number = number
def __repr__(self):
return self.number
a = CustomInt(1)
b = CustomInt(1)
print(a==b)
--> False
```
您所拥有的将起作用,
b是b[0]
但是,a是b
,因为它们是同一个对象,这是CPython(小整数被缓存)的一个实现细节。这听起来像是一个X-Y问题,您实际上想解决什么?a
的值为1,但不是b
的第0个元素,相反,a
是第0个元素a
。我试图让部分a=a[0]
返回它是a的第0个元素,而部分b=b[0]
返回它是BYou的第0个元素是错误的a
是a
和B
的第0个元素。这就是告诉你的。正如我所解释的,在任何给定的CPython进程中,只有一个值为1的int
对象。但再说一次,你为什么在乎?你真正想解决的是什么?好吧,散列在这里是不相关的,它是\uuuuueq\uuuu
matters@juanpa.arrivillaga是,但如果没有重载,\uuuuuu eq\uuuuu
使用\uuuuuuu散列\uuuuuu
属性进行比较我不知道为什么会使用\uuuuuuuu散列\uuuuu
。它可能只是通过标识进行比较,使用的是is
(等效的内部CPython函数,它只是一个指针等式)。在任何情况下,我认为这可能是一个解决方案,但我怀疑OP可以完全绕过这样做的需要。是的,这也是我脑海中的第一个猜测解决方案。但正如@juanpa.arrivillaga所说,这可能是一个XY问题。@FloLie是的,我知道它是res=(v==w)?Py_True:Py_False
其中v
和w
是PyObject指针,所以它只是硬编码而已!
class CustomInt:
def __init__(self, number):
self.number = number
def __repr__(self):
return self.number
a = CustomInt(1)
b = CustomInt(1)
print(a==b)
--> False
```