Shade3D 公式

リストに関すること


#1

植物の書き方を相談するスレッド からの議論を継続:

ライフゲームを作ろうと思っているのですが、C言語の配列のようなことをPythonでしようと思いますと、リストを使うようですが

import random
y=0
data=[[0]*10]*10
data[1][1]=1
print data

とするのと

import random
y=0
data=[]
for y in range(0,10):
 data.append([0]*10)
data[1][1]=1
print data

とするのでは、出力が違う点がよく分かりません。個人的には、いっしょになってもよいように思うのですが :tired_face:
ご指導のほどお願いいたします。


#2

同じ配列(への参照)が10個入った配列を作成するのと、
同じ値の異なる配列を10回追加した配列を作成する違いかと思います。

id 関数で配列のオブジェクトidを出力すると
以下の場合は配列に同じ配列のオブジェクトidが入ります。

y=0
data=[[0]*10]*10
data[1][1]=1
print data
for i in data:
	print i, id(i)

結果

[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997876480

以下の場合は、配列に別々の配列のオブジェクトidが入ります。

y=0
data=[]
for y in range(0,10):
	data.append([0]*10)
data[1][1]=1
print data
for i in data:
	print i, id(i)

結果

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997887472
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 4997877704
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997888264
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997889632
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997886608
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997875184
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997875616
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997853480
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997887184
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 4997875760

以下のように書くと同じ結果になります。

y=0
data=[]
item = [0]*10
for y in range(0,10):
	data.append(item)
data[1][1]=1
print data

#3

さっそくのアドバイスありがとうございます。
だいぶイメージがわきました。
ただ、当分は応用方法が思いつかないので、
data=[[0]*10]*10
は使わないと思います。
ちなみに皆様はどのような使い方をされていますか?