1

なぜこうなった?

バージョン 1:

mylist= [1,2,3,4,5]
print mylist
for index, value in enumerate(mylist):
    value = 0
print mylist

バージョン 2:

mylist= [[1],[2],[3],[4],[5]]
print mylist
for index, value in enumerate(mylist):
    value[0] = 0
print mylist

出力 1:

[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

出力 2:

[[1], [2], [3], [4], [5]]
[[0], [0], [0], [0], [0]]

どちらのバージョンもローカル変数を作成し、リスト自体を上書きしないと想定しました。2番目のバージョンではそうではないと思います。私はpython 2.7を使用しています。明らかに、値の別のコピーを作成する for ループ内に別の変数を含めることができます。これを理解するのに少し時間がかかり、コードの機能が台無しになりました。

解決:

value = list(value)
4

2 に答える 2

4

value2 番目のバージョンでは に割り当てていません。によって参照されるリストに含まれるインデックスvalueに割り当てています。

Python の名前は値への参照であり、メモリの場所ではありません。これらの値の一部は、リストなど変更可能です。リストには他の値への参照が含まれているためvalue、リストvalue[0]であり、リストに含まれる参照です。

最初の例のリストを変更するには、indexfrom enumerate を使用してリスト内のインデックスを変更します。

for index, value in enumerate(somelist):
    somelist[index] = 0

2 番目の例のネストされたリストを変更したくない場合は、代わりにそれらのコピーを作成する必要があります。

for index, value in enumerate(somelist):
    value = value[:]  # full list slice, same as a copy.
于 2013-03-17T18:14:52.510 に答える
0

リストをローカルにコピーする別の Pythonic の方法を次に示します。

mylist= [[1],[2],[3],[4],[5]]
print mylist
mylst = []
for index, value in enumerate(mylist):
    mylst += [[value[0]]]
print mylst
于 2013-03-19T05:37:26.647 に答える