在python列表中搜索空列表是否不准确?

在python列表中搜索空列表是否不准确?,python,list,Python,List,为什么b列表即使不在某个列表中,也能在某个列表中找到 >>> a = [] >>> b = [] >>> a is b False >>> some_list = [0, 1, 2, 3, a] >>> some_list.index(b) 4 .index返回第4位,因为它比较两个空列表a和b。他们是平等的。如果执行a is b,它会比较对象的内存地址,并且它们是不同的,这就是此表达式计算结果为Fals

为什么b列表即使不在某个列表中,也能在某个列表中找到

>>> a = []
>>> b = []
>>> a is b
False
>>> some_list = [0, 1, 2, 3, a]
>>> some_list.index(b)
4

.index
返回第4位,因为它比较两个空列表a和b。他们是平等的。如果执行
a is b
,它会比较对象的内存地址,并且它们是不同的,这就是此表达式计算结果为False的原因

In [1]: a = []
In [2]: b = []
In [3]: a == b
Out[3]: True

.index
返回第4位,因为它比较两个空列表a和b。他们是平等的。如果执行
a is b
,它会比较对象的内存地址,并且它们是不同的,这就是此表达式计算结果为False的原因

In [1]: a = []
In [2]: b = []
In [3]: a == b
Out[3]: True

Python的
list.index
在测试中搜索相等性,而不是身份<代码>a和
b
不相同,但相等:

>>> a = []
>>> b = []
>>> a == b
True
如果需要不同的相等定义,请在对象a、b上定义,例如:

def __eq__(self, other):
  return self is other
def __hash__(self):
  return 0 # Insert a more sensible, object-specific hash function here

Python的
list.index
在测试中搜索相等性,而不是身份<代码>a和
b
不相同,但相等:

>>> a = []
>>> b = []
>>> a == b
True
如果需要不同的相等定义,请在对象a、b上定义,例如:

def __eq__(self, other):
  return self is other
def __hash__(self):
  return 0 # Insert a more sensible, object-specific hash function here
它们是不同的:

a is b
仅当它们都绑定到同一个对象时才为真。但是,索引仅检查值是否相等

举个C语言的例子,
3==3

int a = 3;
int b = 3;
&a == &b // this is false
它们是不同的:

a is b
仅当它们都绑定到同一个对象时才为真。但是,索引仅检查值是否相等

举个C语言的例子,
3==3

int a = 3;
int b = 3;
&a == &b // this is false

尝试执行
a==b
。“==”运算符检查变量的值是否相同,索引函数也是如此。
函数comapres变量id()

这可能会有帮助:

>>> a = []
>>> b = []
>>> id(a)
4299650400
>>> id(b)
4299730096
>>> a == b
True
>>> a is b
False
还要注意这一点:

>>> some_list = [0, 1, 2, 3, a]
>>> some_list.index(b)
4
>>> some_list[4] == b
True
>>> some_list[4] is b
False

尝试执行
a==b
。“==”运算符检查变量的值是否相同,索引函数也是如此。
函数comapres变量id()

这可能会有帮助:

>>> a = []
>>> b = []
>>> id(a)
4299650400
>>> id(b)
4299730096
>>> a == b
True
>>> a is b
False
还要注意这一点:

>>> some_list = [0, 1, 2, 3, a]
>>> some_list.index(b)
4
>>> some_list[4] == b
True
>>> some_list[4] is b
False

附加:列表是可变的,因此每次将[]赋值给变量都会在内存中产生不同的对象。a=[];b=[];a是b#返回False。相反的一个例子是不可变的字符串。将相同的字符串值赋给不同的变量基本上指向内存中的同一对象。a=“你好”;b=“你好”;a是b#返回True。@汤姆:这是小字符串的实现细节,但是
a=“Hello”*1000;b=“你好”*1000;(a是b)==False
。谢谢你,埃里克森,我不知道!所以:a=“你好”+“世界”;b=“你好”+“世界”;(a是b)=False。@这可能是,也可能不是,取决于实现。没有理由特别期望任何一种结果,也没有理由编写期望任何一种结果的代码。另外:列表是可变的,因此每次将[]赋值给变量都会在内存中产生不同的对象。a=[];b=[];a是b#返回False。相反的一个例子是不可变的字符串。将相同的字符串值赋给不同的变量基本上指向内存中的同一对象。a=“你好”;b=“你好”;a是b#返回True。@汤姆:这是小字符串的实现细节,但是
a=“Hello”*1000;b=“你好”*1000;(a是b)==False
。谢谢你,埃里克森,我不知道!所以:a=“你好”+“世界”;b=“你好”+“世界”;(a是b)=False。@这可能是,也可能不是,取决于实现。没有理由特别期望任何一种结果,也没有理由编写期望任何一种结果的代码。