2017-03-14 6 views
1

だから私は、この完全なリストのスライスがこれまでに使用されている場合私の質問があり、私はフルリストスライスはいつ使用されますか?

>>> dinner = ['steak', 'baked potato', 'red wine'] 

のようなリストを持っているならば、未指定の始まりとエンドポイントとスライスがリスト全体で

>>> dinner[:] 
['steak', 'baked potato', 'red wine'] 

ことを理解練習、もしあれば、そのユースケースは何ですか?なぜリストdinnerを参照するのではなく、スライス表記なしで[:]

+1

コピーを作成するには、たとえば、同じリストを反復処理して変更する場合などです。 –

答えて

4

フルリストスライスは、リストの浅いコピーを作成する通常のPython構文です。

>>> dinner = ['steak', 'baked potato', 'red wine'] 
>>> dinner1 = dinner # just another reference to the original object 
>>> dinner2 = dinner[:] # makes a new object 
>>> dinner[0] = 'spam' 
>>> dinner1 # dinner1 reflects the change to dinner 
['spam', 'baked potato', 'red wine'] 
>>> dinner2 # dinner2 doesn't reflect the change to dinner 
['steak', 'baked potato', 'red wine'] 

オリジナルのリストをスライスなしで参照するだけで、新しい参照の元のリストの変更も表示されます。それは時々あなたが望むものであり、時にはあなたが望むものではありません。

+0

オリジナルのリストを変更するためにスライスに割り当てることもできます。 'dinner [:] = []' –

+0

だから、Pythonでは、変数はリスト自体ではなく、リストへのポインタです。今、この記法を持つことは理にかなっています。 – wogsland

+0

@wogsland私はこれを見ることを強くお勧めします。https://www.youtube.com/watch?v=_AEJHKGk9ns – timgeb

3

代入演算子のLHS上で使用した場合、完全なリストのスライスは、インプレースリストを変異させるために使用されます。

>>> dinner = ['steak', 'baked potato', 'red wine'] 
>>> dinner[:] = ['pasta'] 
>>> dinner 
['pasta'] 

あなたがする必要がある場合はそれ以外の場合は、完全なリストのスライスは、通常は便利来ます修正/元のリストを変異させ、ループに言うと、あなたはより多くのapproriately浅いコピーと呼ばれる、参照コピーを維持する必要があります。

for i in dinner[:]: 
    # mutate dinner without running into problems 

これは、forループの振る舞いは、の状態と一致することができます元のlis t。

またcopy.copyを使用するか、元のリストにlistを呼び出すことにより、簡易コピーを作成することができますが、[:]は、より一般的に使用されている、言語構造のもそれほど冗長であること。

+1

ループでコピーを渡すことはとても便利です。 – wogsland