2008年4月22日火曜日

データの型、リスト

データの型、リスト

2008/05/02 修正 この記事間違ってます。
変数は変更できます。チュートリアル電卓編の 変数_(アンダースコア)とごっちゃになってます。
変数にオブジェクトを代入すると思わぬ結果になるそうです。オブジェクトのリファレンス先が変更されたとき、、この辺から脳が活動停止してますが、そのうち分かるように。なれるといいんですが。。。
どう間違えたかも、記録のうちなので、本文はそのままで恥をさらし続けます。

最後の方の、リストの初期化の仕方、これは危ないそうです。
>>> Data = [0.0] *6

典型的な Python になれてない人がよくする間違いだそうで、私もはまりました。
Data = [0.0 for i in range(6)]

で個々に初期化する方がいい、とありましたので、次からそうします。
2008/05/02



データタイプについて、今まで変数だけを使っていました、(自分的には、、)そういえば、変数は変更してはいけないというのを思い出しました。
A=1 とか一度した上に、A=2 とか代入してはいけないそうです。変数は不変性オブジェクト(棒読み)<くどいですね、なので変更してはいけないとか、居心地悪いですね。

と、チュートリアルの一番初めのほうにありました。変数を変えてはいけない?じゃあ何が変数よ?定数やんかそれ?ともあれ、後で変更するデータや数値は ’リスト’ とかいうデータの型が好ましいそうです。今までのソース、全部?書き換えが必要ですねー、しませんけど。でもこれからの分には、反映します、気がつく限り。

では、何が不変で何が可変か?初期値は参照するだけなので定数(変数)でいいとしましょう。いい?。可変データは、プログラム中、外の世界からもらってくるデータ。大抵、.read とか .get とか .in とかなんかそんなもの。 COM ポートのPIN のステイタスとか、受信データ、測定データのバッファにするような Data とかはリストにすべきなようです。

リストをつかうには [ ] を使います。
Data[] となれば Data は、変数でなくてリストになります、[]の中にはリストの番地を入れて呼んだり、内容を書いて書き込んだりできるみたいです。別に1つのデータでもいいので、一つのときは[0]番地だけを使うようなりストを作りましょう。

リストを使うには、何らかの形で(初期値を入れるとか)リストであることをPython に伝えないといけません。

>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
NameError: name 'ListTest' is not defined


教科書では、初期値を代入するラインから始まっていますが、これでリストを初期化しているのです。
.append()を使って大きさを変えることも出来るので、空のリストを作ってもいいです。いいんですか?(笑

>>> ListTest =[]
>>> ListTest
[]
>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
IndexError: list assignment index out of range

あせってはいけません。

>>> ListTest[0]

Traceback (most recent call last):
File "", line 1, in
ListTest[0]
IndexError: list index out of range

ええっ?

>>> ListTest[0] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[0] = 0.0
IndexError: list assignment index out of range

なんですと?
ここで[0] が指すのは1番地、1 のリストですが、「空のリスト」は、0 のリスト、かなり嫌な雰囲気です。
上等な技はスカッと忘れて1個だけのリストを初期化しましょう。

>>> Data = [0.0]
>>> Data
[0.0]
>>> Data[0]
0.0
>>> Data[0] =1.25
>>> Data[0]
1.25
>>> Data[3] =2.3

Traceback (most recent call last):
File "", line 1, in
Data[3] =2.3
IndexError: list assignment index out of range


Data だけだとリストを全体を示す[]がついてくるので、値を引用するには [] のなかに番地を入れましょう。では、6個のリストを初期化しましょう。

>>> Data = [0.0] *6 ## < これはよく無いやりかた、別の↑方法がいいらしいです。
>>> Data
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
>>> Data[0]
0.0
>>> Data[3] = 2.5
>>> Data
[0.0, 0.0, 0.0, 2.5, 0.0, 0.0]
>>> Data[3]
2.5
>>>

番地で内容を呼べるので、for ループとかにも使えそうでまぁ、ちょっと便利そうです。

0 件のコメント: