является ли поиск в списке python для пустого списка неточным?

#python #list

#python #Список

Вопрос:

Почему список b можно найти в some_list, даже если его нет в some_list?

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

Ответ №1:

.index возвращает 4-ю позицию, потому что сравнивает a и b, два пустых списка. Они равны. Если вы это сделаете a is b , он сравнивает адреса памяти объектов, и они разные, вот почему это выражение принимает значение False.

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

Комментарии:

1. Дополнительно: списки изменчивы, поэтому каждое присвоение [] переменной приводит к созданию другого объекта в памяти. a=[]; b=[]; a is b # возвращает False . Примером обратного являются строки, которые являются неизменяемыми. Присвоение одного и того же строкового значения разным переменным по существу указывает на один и тот же объект в памяти. a=»Привет»; b= «Привет»; a — это b # возвращает True.

2. @tom: Это деталь реализации для небольших строк, но a = "Hello" * 1000; b = "Hello" * 1000; (a is b) == False .

3. Спасибо, эриксун, я этого не знал! Итак: a =»Привет» «Мир»; b = «Привет» «Мир»; (a равно b) == False.

4. @tom это может быть или не быть, в зависимости от реализации. Нет причин ожидать какого-либо конкретного результата и нет причин писать код, который ожидает любого результата.

Ответ №2:

list.index Поиск в Python проверяет равенство, а не идентичность. a и b не идентичны, но равны:

 >>> a = []
>>> b = []
>>> a == b
True
  

Определите __eq__ для своих объектов a, b, если вам нужно другое определение равенства, например:

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

Ответ №3:

Они разные:

 a is b
  

верно, только если они оба привязаны к одному и тому же объекту. Однако index проверяет только, равны ли значения.

Чтобы привести пример C, 3 == 3 но

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

Ответ №4:

Попробуйте выполнить a == b . Оператор ‘==’ проверяет, совпадают ли значения переменных, и то же самое делает функция index. is Функция сопоставляет переменные 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