2

3レベルのネストされたリストを作成しました

#run on Python 3.2.3  32 bit on Win 7
L2=list(0 for i in range(2))
L3=list(L2 for i in range(3))
L4=list(L3 for i in range(4))
#give a new value to the very first number in list:
L4[0][0][0]=5
print("L4:")
print(L4)
#outputs erronously:
#[[[5, 0], [5, 0], [5, 0]], [[5, 0], [5, 0], [5, 0]], [[5, 0], [5, 0], [5, 0]], [[5, 0], [5, 0], [5, 0]]]

明示的に与えられた同じリスト

#the same L4 given explicitly:
anotherL4=[[[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
print("anotherL4:")
#give a new value to the very first number:
anotherL4[0][0][0]=5
print(anotherL4)
#outputs correctly:
#[[[5, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0]]]
4

4 に答える 4

3

あなたが間違っている。参照を複数回コピーしました。つまり、実際にはすべて同じリストです。

于 2012-06-03T22:24:00.283 に答える
3

を書くときlist(L3 for i in range(4))は、ジェネレーター理解の各反復で同じリストL3を生成するように指示しています。その後、そのリストを変更すると、すべてが同じリストへの参照であるため、変更はどこにでも表示されます。

あなたがすることによってあなたが望むように見える効果を得ることができます

list(list(L3) for i in range(4))

を使用list(L3)すると新しいリストが作成されるためです。

于 2012-06-03T22:25:37.323 に答える
0

念のために、

a = 1
b = 2
c = [a,b]
a += 1
print c
于 2012-06-03T22:25:51.237 に答える
0

あなたの問題は、リストのリストではなくリスト参照のリストを作成したことです。参照はすべて単一のリストを指していたので、その単一のリストを変更すると、すべての参照が変更を示します。

L0 = range(3)
L1 = range(3)

print(id(L0)) # prints a number
print(id(L1)) # prints a different number
print(id(L0) == id(L1))  # prints False

print(L0 is L1)  # prints False; not same objects
print(L0 == L1)  # prints True; values match

# your original code:
L2=list(0 for i in range(2))
L3=list(L2 for i in range(3))
L4=list(L3 for i in range(4))

print(L3[0] is L2)  # prints True; L3[0] is a reference to L2

を使用して修正し、何を行っているかを明示的に示すことができますcopy.deepcopy()

import copy

L2 = [0 for i in range(2)]
L3 = [copy.deepcopy(L2) for i in range(3)]
L4 = [copy.deepcopy(L3) for i in range(4)]
#give a new value to the very first number in list:
L4[0][0][0]=5
print("L4:")
print(L4)

ジェネレーター式を作成し、それを に渡してlist()強制的にリストに展開する代わりに、上記のコードでリスト内包表記を使用して直接リストを作成したことに注意してください。

より通常、このクレイジーなことをしたい場合は、いくつかのリスト内包表記をネストする必要があります。

L4 = [[[0 for _ in range(2)] for _ in range(3)] for _ in range(4)]

これにより、リストのリストの新しいリストを構築していることは明らかです。また、使用するcopy.deepcopy()場合は、基本的に一連のゼロをコピーするだけなので、ゼロを使用して新しいリストを作成することもできます。

于 2012-06-03T22:46:20.590 に答える