どういう意味?


95

私はいくつかのPythonコードを分析していますが、何がわかりません

pop = population[:]

手段。それはJavaの配列リストのようなものですか、それとも二次元配列のようなものですか?


1
関連して、リストのクリアは、pop.clear()..ではなく、del pop [:]またはpop [:] = []を実行することによってのみ可能です(dictsで行うように)。
マッケ

PythonのスライスのグッドSOの議論:stackoverflow.com/questions/509211/...
スコット・C・ウィルソン

回答:


109

これはスライス表記の例であり、その機能はのタイプによって異なりpopulationます。populationがリストの場合、この行はリストの浅いコピーを作成します。タイプtupleまたはのオブジェクトの場合str、それは何もしません(行はなしでも同じように動作し[:]ます)。(たとえば)NumPy配列の場合は、同じデータに新しいビューを作成します。


14
念のため:スライスは浅いコピーを返します。
アンドレ・キャノン

4
@ilius:おそらくl.copy()もっと読みやすいですが、機能しません。
スヴェンマルナッハ、

13
list(l)常に機能し、より読みやすく、次のような場合でもコピーが返されることが保証されていますnumpy.array
Rosh Oxymoron '29

1
@エリ:はいlist.clear()。ただし、これがSOに関するこの種の質問の大幅な削減につながるまでには、しばらく時間がかかります。:)
Sven Marnach

1
@MichaelGraczyk:ここでNumPy配列について話していると思います。を使用するよりもA[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)]、私はほとんど常に好みnumpy.rollaxis(A, axis, 0)[k]ます。一般に、slice()オブジェクトを直接作成する必要があるユースケースに遭遇することはめったにありません。とにかくそれらが必要な場合、NumPyはs_それらを作成する代替方法としてヘルパーを提供します。
Sven Marnach 14

27

また、リストスライスが一般にリストの一部のコピーを作成することを知っていると役立つ場合があります。例えばpopulation[2:4]、population [2]とPopulation [3]を含むリストを返します(スライスは右排他です)。population[:]デフォルトでそれぞれ0とlength(population)になるように、左と右のインデックスを除外して、リスト全体を選択します。したがって、これはリストのコピーを作成するための一般的なイディオムです。


15

まあ...これは本当にコンテキストに依存します。最終的には、sliceオブジェクト(slice(None,None,None))を次のメソッドのいずれかに渡します: __getitem____setitem__または__delitem__。(実際には、オブジェクトにがある場合__getslice__、それはの代わりに使用されますが__getitem__、現在は非推奨であり、使用すべきではありません)。

オブジェクトはスライスを使って好きなようにできます。

次のコンテキストで:

x = obj[:]

これはobj.__getitem__、渡されたスライスオブジェクトで呼び出されます。実際、これは次のものと完全に同等です。

x = obj[slice(None,None,None)]

(ただし、前者の方がsliceコンストラクタを検索する必要がないため、おそらくより効率的ですが、すべてバイトコードで行われます)。

ほとんどのオブジェクトでは、これはシーケンスの一部の浅いコピーを作成する方法です。

次:

x[:] = obj

__setitem__基づいて(呼び出す)項目を設定する方法objです。

そして、私はあなたがおそらく何を推測できると思います:

del x[:]

;-)を呼び出します。

異なるスライスを渡すこともできます:

x[1:4]

構成 slice(1,4,None)

x[::-1]

構成slice(None,None,-1)など。参考資料Pythonのスライス表記について説明する



6

リストのコピーを作成するのではなく、既存のリストに新しい名前を割り当てるだけです。


5

[:]
リミッターまたはスライスでの配列に使用、ハッシュ
例:
[1:5] 1〜5の範囲の値を表示します。つまり、1〜4
[start:end]

は配列で基本的にスライスに使用されます。表示する値またはキー。「:」は配列全体をパケットに制限またはスライスするために使用されます。


1
同じような答えがすでに5つあり、受け入れられているものでさえあるような古い質問にぶつかる理由はありません...さらに、a[1:5]2-4ではなく1-4の要素を返します。
Skamah One 2013

@SkamahOneああ、わかりません。このケースではないかもしれませんが、死んだ問題を提起することが価値がある場合があります。別の洞察、別の表現など。この場合、あなたは答えを訂正し、うまくいけば彼らも何かを学びました。
プリフタン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.