0

リストを一度に2つに分割して(10回)、各パーティションで操作を実行しようとしています。この操作をリストに対して一度に1:9の比率で実行したいと思います。つまり、リストを10倍に分割し、最初の反復で最初の折りと残りの9で操作を実行し、2番目の反復で2番目の折りと残りの9で操作を実行します。これを行うために、元のリストのコピーを保持し、フォールドの1つを一時変数に割り当て、リストから削除して、残りを2番目のパーティションとして取得することにしました。次に、次の反復のためにリストのコピーをリストに再割り当てします。ただし、コピーとオリジナルはforループ全体で常に同じであるように思われるため、インデックスが範囲外のエラーになります。問題の簡単な例を次に示します。

>>> a = ['a', 'b', 'c', 'd', 'e', 'f']
>>> b = a
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> for i in xrange (len(a)):
    del (b [i])
    b = a

Traceback (most recent call last):
  File "<pyshell#22>", line 2, in <module>
    del (b [i])
IndexError: list assignment index out of range

aとbの両方がメモリ内の同じ場所を指しているようで、リストの実際のコンテンツを格納する場所は1つだけです。ここでの問題と、問題を解決する方法を教えてください。前もって感謝します!

4

2 に答える 2

2

行を変更することでリストのコピーを作成できます

b = a

b = a[:]
于 2013-01-19T18:26:40.120 に答える
2

b = copy.deepcopy(a)の代わりにを使用してリストをコピーしますb = a。リストの各要素を再帰的にコピーします。ただし、これは、以下の3つの選択肢よりも遅くなることも意味します。

代替案:

b = a [:]
b =リスト(a)
b = copy.copy(a)

すべての選択肢は浅いコピーを実行します。つまり、元のリストの要素がオブジェクトである場合、それらは参照されます。copyリストだけでdeepcopyなく、あらゆるオブジェクトに対して一般化できます。

の問題=は、同じオブジェクトへの新しい参照を作成することです。これがpythontutorでのコードの視覚化です-http: //goo.gl/3UN3T

于 2013-01-19T18:31:48.297 に答える