3

重複の可能性:
リスト全体をスライスするスライス割り当てと直接割り当ての違いは何ですか?

私は学校に行くお金がないので、高速道路の料金所でシフトを組みながら Python を独学しています (顧客の少ない長い夜)。(ところで: Coursera はすべての言語に翻訳する必要があります...)

ここで、リストがある場合は次のことを読みましたl

l = ['a', '', 'b']

そして、次のように空の文字列を除外したい:

l = [c for c in l if c]

またはそのように:

l = filter(lambda x: x, l)

代わりにこれを行うことをお勧めします。

l[:] = ... # either method 1 or method 2 above

l特に他の変数がそれを指している場合は、最初の への参照を「失う」ことはありません。

私の質問:

  • l[:]この場合、「 」の内容を意味し、「同じ」へlの再割り当てを明確に許可するのはなぜですか?l

  • for same-list-reassignmentsの使い方を完全に誤解していませんか?l[:]

もし私が を持っていてlを頼んだらl[:]、後者はオリジナルの実際のコピーだと思いましたlか?

参考:「Pythonを学ぶ」 →リストをコピーするには、組み込みのリスト機能や標準ライブラリのコピーモジュールを使うなど、さまざまな方法があります。おそらく最も一般的な方法は、最初から最後までスライスすることです

ありがとう!

4

3 に答える 3

3

Python では、リストのスライスを取得することと、リストのスライスを設定することの間に違いがあります。実際、これらは実際には別個の操作です (それぞれ__getitem____setitem__)。したがって、get の場合に当てはまることは、set の場合には当てはまらない場合があります。

前者の場合、l[:]リストのコピーを取得することを意味します (古いリストとまったく同じ内容の新しいリストを生成します)。後者の場合、l[:] = ...リストの内容を別のものに設定することを意味します。

于 2012-08-22T17:50:59.417 に答える
2

割り当ての左側でスライス演算子を使用する場合、リストの選択された要素の右側にシーケンスを格納するように python に指示しています。

つまり、 を置き換えるのではなく、lの要素に代入します。 l

于 2012-08-22T17:50:53.217 に答える