私の友人が次の Python コードを見せてくれました。
a[1:] == a[:-1]
a
すべての項目が同一である場合に True を返します。
私は、このコードは一目で理解するのが難しく、さらにa
、比較のために のコピーが 2 つ作成されるため、メモリの使用効率が悪いと主張しました。
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
それは 2 つのスライス コマンドに要約されます -SLICE+1
とSLICE+2
. ドキュメントは、これらのオペコードが実際に の新しいコピーを作成するのかa
、それとも単なる参照を作成するのかについて明確ではありません。
- SLICE コマンドはコピーします
a
か? - 答えは Python の実装 (Cython、Jython) によって異なりますか?
アップデート
このスニペットは明らかに判読不能で紛らわしいので、実際のコードで使用するつもりはありません。私の関心は純粋に技術的なものです - スライスがリストをコピーするかどうか、そして答えが状況によって異なるかどうかです。