[Python-ml-jp 2752] しんぷるいずざべすと

機械伯爵 kikwai @ d5.dion.ne.jp
2004年 2月 14日 (土) 12:02:23 JST


 ども、機械です。

>  まず、やれば自明な指摘(^^;;から

 はい、すみませんです・・・

 カウンタ減らすの忘れてました。

>  で、便乗質問ですが
>
>> a, b = 0, 0
>
>  についてです。python では基本的にはオブジェクトの代入はポインタ(とい
>うかリファレンスですか)なので、C などのように a = b = 0 ではなく
>a, b = 0, 0とお書きであると考えます。

 a = b = 0のほうについては、すでにレスが付いていま
すが、基本的なことを言えば、Cとは異なり、Pythonでは
「代入式」というものは存在せず、「代入文」だけが存
在します。

 C言語ではb=0は0という値を返しますので、その0をaに
代入する、というルールが適用できます。

 a = ( b = 0 )

 ところが、Pythonではb=0は文ですから値を返しません。

 よってa = b = 0は、「そういう書き方が許されている」
だけで、a = (b = 0)にはなりません。

※エラーが出ます。

 つまり「書き方を一つ余分に覚える」ことになるわけ
です。

 で、同じ覚えるなら、タプルの展開のほうが実感でき
やすいかな、と思って、こちらを書きました。

 a, b, c = 1, 2, 3

 とか、応用も利きますし・・・(まぁ、ここらへんは
気分です)

>  1. 数値型の場合は a = b = 0 でも a と b は別のオブジェクトとなる。
>  2. しかし、そのクセがつくと a = b = [] とかやってしまう可能性が高い
>     ので a, b = 0, 0 と書いておいたほうがよい。
>
>  の2つは正しいでしょうか?

 1.・・・同じオブジェクトですよ。
 同一性テスト用演算子isを使ってみましょう。

>>> a = 1
>>> b = 1
>>> a is b
True

 整数オブジェクトは、いちいち新しいオブジェクトを
作っていません。

 でも、リスト(可変オブジェクト)とかは違いますよ
ね。

>>> a = []
>>> b = []
>>> a is b
False
>>>

 2.文法の問題なんです。

 「連結された'='は、一番右辺のオブジェクトをほーり
こむ」という規則です。

 よって、空リストと0で、別規則が適用されているわけ
ではありません。

 けっこーシンプルですよね?

   /機械伯爵/




Python-ml-jp メーリングリストの案内