Друг мой показал мне следующий код Python:
a[1:] == a[:-1]
Возвращает True, если все элементы в a
идентичны.
Я утверждал, что код трудно понять с первого взгляда, и более того - он неэффективен в использовании памяти, потому что для сравнения будут созданы две копии a
.
Я использовал Python dis
, чтобы узнать, что происходит за капотом в a[1:]==a[:-1]
:
>>> def stanga_compare(a):
... return a[1:]==a[:-1]
...
>>> a=range(10)
>>> stanga_compare(a)
False
>>> a=[0 for i in range(10)]
>>> stanga_compare(a)
True
>>> dis.dis(stanga_compare)
2 0 LOAD_FAST 0 (a)
3 LOAD_CONST 1 (1)
6 SLICE+1
7 LOAD_FAST 0 (a)
10 LOAD_CONST 2 (-1)
13 SLICE+2
14 COMPARE_OP 2 (==)
17 RETURN_VALUE
Он сводится к двум командам среза - SLICE+1
и SLICE+2
. Документация неясна относительно того, действительно ли эти коды операций создают новую копию a
или просто ссылку на нее.
- Выполняет ли команды SLICE
a
? - Отвечает ли ответ между реализациями Python (Cython, Jython)?
Обновление
Этот фрагмент явно непонятен и запутан, и я не буду его использовать в реальных код. Мой интерес носит чисто технический характер: копирует ли список список и зависит ли ответ в разных обстоятельствах.