1

昨日、2 次元配列の初期化について質問しました。リンクは次のとおりです: How to implement this C++ source in python?

答えには問題があります。友人は次のように述べています。

G = [[0]*11]*11

しかし、このように を に変更するG[0][0]2、すべて がG[i][0](0<=i<11)に変更されますが2、その理由はわかりません。

補足:

これは私が考えたものです: 0or other 番号はimmutableであるため、そのうちの 1 つを変更しますが、他の番号は変更されません。しかし、リスト [0, 0 ,0 ,.....] はmutableであるため、[0, 0, ...] * 11 とすると、すべての [0, 0, ...] リストは同じになります。is関数が真であるため。私は正しいですか?

4

2 に答える 2

4

同じリストへの参照が 11 件あるためです。

G = [[0] * 11 for x in range(11)]
于 2012-04-14T00:16:36.000 に答える
2

この*11表記は、同じオブジェクトへの 11 の参照を作成します。オブジェクトが不変である場合、それを変更しようとすると別のオブジェクトへの参照が変更されるため、気付かないことがあります。オブジェクトが変更可能な場合、リストのメンバーに割り当てるなど、オブジェクトを変更できます。すべての参照は同じオブジェクトに対するものであるため、それらはすべて同時に変更されます。

可変/不変は物事を変えるように見えるかもしれませんが、そうではありません.Pythonはどちらの場合でも一貫しています. 次の例を検討してください。

G[0] = [3]*11

G[1] が変更されていないことがわかります。

于 2012-04-14T00:55:47.700 に答える