2017-01-14 4 views
15

我々は(浅い)は[:]を使用してlistをコピーすることができます。リストをコピーするときの '[:]'と '[::]'スライスの違いは?

l = [1, 2, 3] 
z1 = l[:] 

我々はまた、(浅い)が[::]を使用して、それをコピーすることができます。

z2 = l[::] 

、今z1 == z2Trueになります。私はExplain Python's slice notationの回答を読んだ後、これらのスライスがどのように機能するのか理解しています。

しかし、私の質問は、内部的にこれらの2つの違いはありますか?コピーで他のコピーより効率的ですか、まったく同じことをしますか?

+6

これはスライスを作成する最初のコロンですが、2番目のコロンは何も変更しません。他のさまざまなオプション( '[0:]'、 '[1]'、など)を考え出すこともできますが、それらは同じことをします。 – jonrsharpe

+0

その質問は本当に私の質問に答えるものではありませんが、どういうことが分かっているのか分かりません。 – user6774416

+1

この質問はhttp://stackoverflow.com/q/509211/674064でカバーされるかもしれませんが、それはhttp://stackoverflow.com/q/509211/674064よりはるかに具体的であり、独自のメリットがあります。したがって、再開の投票。 –

答えて

16

少なくともPython 3のでは、全く違いはありませんです。あなたがしたい場合は、dis.disを使用して、これらのそれぞれに対して生成バイトコードを確認することができます。l[:]のために放出される

l = [1, 2, 3, 4] 

バイトコードを:

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 

あなたが見ることができるように、彼らはまったく同じです。どちらも、startstopの値を、スライス(BUILD_SLICE)の構築に使用して適用するために、どちらもNone(2つのLOAD_CONSTS ')をロードして適用します。 Standard Type hierarchyslices用ドキュメントに記載されているようにNone sがこれらのデフォルトです:

特別な読み取り専用属性:startがバインドlowerです。 stopが上限です。 stepstepの値です。省略された場合はそれぞれNoneです。これらの属性は任意のタイプを持つことができます。

[:]を使用すると、キーストロークが少なくなります。

>>> 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[::]用:


それが原因それはわずかよりパフォーマンスかもしれないl[:]のために以下のコマンドに、Pythonの2.xで生成されたバイトコードが異なることに注意することは、実際に面白いと:

>>> 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 

同様に他のものにも適用されます。

2

Python language reference section 6.3.2, Subscriptionsによれば、配列の内部式は整数またはスライスのいずれかと評価されなければなりません。これらの例はどちらも同じスライスを生成し、したがって同じです。明示的に既定値(start=0stop=len(sequence)以上、step=1)を指定することで、同じ効果を持つほかにも多数のスライスがあります。

関連する問題