少なくとも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
あなたが見ることができるように、彼らはまったく同じです。どちらも、start
とstop
の値を、スライス(BUILD_SLICE
)の構築に使用して適用するために、どちらもNone
(2つのLOAD_CONSTS
')をロードして適用します。 Standard Type hierarchyにslices
用ドキュメントに記載されているようにNone
sがこれらのデフォルトです:
特別な読み取り専用属性:start
がバインドlower
です。 stop
が上限です。 step
はstep
の値です。省略された場合はそれぞれ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番目のコロンは何も変更しません。他のさまざまなオプション( '[0:]'、 '[1]'、など)を考え出すこともできますが、それらは同じことをします。 – jonrsharpe
その質問は本当に私の質問に答えるものではありませんが、どういうことが分かっているのか分かりません。 – user6774416
この質問はhttp://stackoverflow.com/q/509211/674064でカバーされるかもしれませんが、それはhttp://stackoverflow.com/q/509211/674064よりはるかに具体的であり、独自のメリットがあります。したがって、再開の投票。 –