pythonがリストをコピーした時の[:]と[:]の違いは何ですか?


前言

new = old[:]
Python老鳥は上のコードの意味を知っています。リストoldをnewにコピーします。これは初心者にとっては迷惑であり、避けなければならない方法です。残念なことに、マーク法が広く使われています。Pythonプログラマはより良いリストコピー法を知らないかもしれません。しかし、ここで紹介するのはpythonのリストコピーについてです。
私たちは[:]を使ってリストをコピーできます。

l = [1, 2, 3]
z1 = l[:]
私たちはまた、浅いものを使って[:]をコピーします。

z2 = [::]
今はZ 1==z 2はTrueになります。Explin Python's slice notationで答えを読んだら、これらの写真の動作原理が分かります。
しかし、私の問題はこの二つの内部に違いがありますか?コピー中は他のものより効率がいいですか?それとも全く同じことをしますか?
答えはどこですか
彼らの間には違いがありません。少なくともPython 3にあります。もしあなたが望むなら、dis.disを使ってこれらのバイトコードをチェックしてもいいです。

l = [1, 2, 3, 4]
l[:]に対して送信されるバイトコード:

from dis import dis
dis('l[:]')
 1   0 LOAD_NAME    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 BUILD_SLICE    2
    12 BINARY_SUBSCR
    13 RETURN_VALUE
l[:]で送信されたバイトコード:

dis('l[::]')
 1   0 LOAD_NAME    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 BUILD_SLICE    2
    12 BINARY_SUBSCR
    13 RETURN_VALUE
完全に同じです。スライスを構築するには(BUILD_)SLICEの開始値と停止値はいくつかの無(二つのLOAD_u)をロードします。CONSTS)を適用します。NONEはStandard Type hierarchy中のスライスドキュメントに記載されているデフォルト値です。
Special read-only atributes:start is the lower bound;stop is the up per bound;step is the step value;each is None if omitted.The se atributes can have any type.
使用[:]は、キーが少ないです。
実際に面白いことに、Python 2.xでは、生成されたバイトコードが異なります。l[:]のコマンドが少ないので、より効率的になるかもしれません。

>>> def foo():
...  l[:]
... 
>>> dis(foo)
 2   0 LOAD_GLOBAL    0 (l)
    3 SLICE+0    
    4 POP_TOP    
    5 LOAD_CONST    0 (None)
    8 RETURN_VALUE 
l[:]:

>>> def foo2():
...  l[::]
... 
>>> dis(foo2)
 2   0 LOAD_GLOBAL    0 (l)
    3 LOAD_CONST    0 (None)
    6 LOAD_CONST    0 (None)
    9 LOAD_CONST    0 (None)
    12 BUILD_SLICE    3
    15 BINARY_SUBSCR  
    16 POP_TOP    
    17 LOAD_CONST    0 (None)
    20 RETURN_VALUE 
もし私は時間がないとしても(私はできません。違いは小さいはずです。)もっと少ない指示が必要なので、l[:]は少しいいかもしれません。
この類似性はもちろんリストには存在しません。Pythonのすべてのシーケンスに適用されます。

# Note: the Bytecode class exists in Py > 3.4
>>> from dis import Bytecode
>>>
>>> Bytecode('(1, 2, 3)[:]').dis() == Bytecode('(1, 2, 3)[::]').dis() 
True
>>> Bytecode('"string"[:]').dis() == Bytecode('"string"[::]').dis() 
True
他の人に対しても同じです。
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考となる学習価値を持っています。質問があれば、メッセージを書いて交流してください。ありがとうございます。