これは問題の1つです!初心者から脱出できるPythonの
words[:]
はここでは魔法のソースです。
守っ:[:]
なし
>>> words = ['cat', 'window', 'defenestrate']
>>> words2 = words[:]
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['cat', 'window', 'defenestrate']
そして今を:
>>> words = ['cat', 'window', 'defenestrate']
>>> words2 = words
>>> words2.insert(0, 'hello')
>>> words2
['hello', 'cat', 'window', 'defenestrate']
>>> words
['hello', 'cat', 'window', 'defenestrate']
ここで注意すべき主なものは、あなたがコピーを反復処理しているのでwords[:]
は、既存のリストのcopy
を返すということですこれは変更されません。
あなたはid()
を使用して同じリストを参照しているかどうかを確認することができます
最初のケースでは:
>>> words2 = words[:]
>>> id(words2)
4360026736
>>> id(words)
4360188992
>>> words2 is words
False
後者の場合:
>>> id(words2)
4360188992
>>> id(words)
4360188992
>>> words2 is words
True
それは注目に値しますその[i:j]
はスライス演算子と呼ばれ、それは新しいtのコピーを返します彼はインデックスi
から始まり、インデックス(j
まで)をリストアップします。
ので、words[0:2]
は最後のインデックスを省略して、開始インデックスが0
がデフォルトを意味省略
>>> words[0:2]
['hello', 'cat']
あなたに与えlen(words)
にそれをデフォルトを意味し、最終的な結果は、あなたがのコピーを受け取るということです全部リスト
コードを少し読みやすくしたい場合は、copy
モジュールをお勧めします。
from copy import copy
words = ['cat', 'window', 'defenestrate']
for w in copy(words):
if len(w) > 6:
words.insert(0, w)
print(words)
これは基本的に最初のコードスニペットと同じことを行い、はるかに読みやすくなります。
(コメントのDSMに記載されているように)また、python> = 3の場合は、同じことを行うwords.copy()
を使用することもできます。
coz、すべての反復で 'words'リストに要素を挿入しています - )) – marmeladze
最初のものは' words'自体ではなく 'words'のコピーです – depperm
最初は、あなたがそれに記事を追加する前に取った 'words'のコピー。 2番目の方法では、単語をループして同時に単語を長くしようとしているので、決して終わりはありません。 – khelwood