#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