1

Pythonに値のテーブルがあるとしましょう。この方法でテーブルを生成します。

table = [[True] * 11] * 7

これにより、7つのリストのリストが作成され、各リストには11のTrue値が含まれます。

[[True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True]]

( )に変更table[6][4]するとします。私はそのスロットだけが変更されることを期待します:Falsetable[6][4] = False

[[True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True False True True True True True True]]

しかし、明らかに、他のすべてのリストの4番目の列も変更されています。

[[True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True]]

どうしたの?

4

3 に答える 3

4

テーブルの7つの要素のそれぞれが同じリストを指していますか?

>>> x = range(5)
>>> y = x
>>> print x
[0, 1, 2, 3, 4]
>>> print y
[0, 1, 2, 3, 4]
>>> x.append("ABC")
>>> print x
[0, 1, 2, 3, 4, 'ABC']
>>> print y
[0, 1, 2, 3, 4, 'ABC']

deepcopyリストの新しいインスタンスを常に追加していることを確認するために使用できます。

from copy import deepcopy
table = [[True] * 11] * 7
table = [deepcopy(x) for x in table]
# now this will behave as you expected
table[6][4] = False
于 2012-11-21T08:46:36.090 に答える
4

もし、するなら

table = [[True] * 11] * 7

11秒でリストを作成し、Trueそれをリストで7つ折りにします。コピーするのではなく、何度か参照することで。

次のように7つの異なるリストを作成する場合

table = [[True] * 11 for _ in range(7)]

あなたのほうがいいです。

于 2012-11-21T08:47:53.363 に答える
3

この方法でリストを作成すると、それらはメモリ内の同じ場所を指しているため、変更は各リストに反映されます。

In [1]: table = [[True] * 11] * 7

In [2]: id(table[0])
Out[2]: 17815672

In [3]: id(table[1])
Out[4]: 17815672

テーブルを作成する正しい方法については、@glglglの答えがその方法です。

于 2012-11-21T08:47:50.237 に答える