質問のコードを実行した場合、argにバインドされるのは、
{'A':98, 'B':76, 'C':54, 'D':56, 'E':78,'F':90} という辞書(dictオブジェクト)。これがまるごとバインドされる。
で、リストとは異なり、辞書({'A':98, 'B':76, 'C':54, 'D':56, 'E':78,'F':90})にたいしてfor ky in arg:のように、for文を使うと、
左のkyには、辞書の各要素の全体({'A':98})ではなく、辞書の各要素の「キー」({'A':98}のキーである'A')が順次バインドされる。
だから
print(ky + ' : ' +str(arg[ky])) を実行すると
'A':98 : 98 (〜略)
とならず
A : 98 (〜略)
となる。
辞書とリストで扱いが異なるのはなんでなの?って思うかもしれないけど、そういうものだと覚えるしかない。
なぜタプルのままではなくてアンパックをして3つの引数にしなければならなかったのか?アンパックしなくても実行結果は同じではないのか、
アンパックしなくても実行結果は同じではないのかって疑問を持つなら、アンパックせずに試してみればいい。
data= (50,100,5) print(list(range(data)))
これを実行すると
TypeError: 'tuple' object cannot be interpreted as an integer
というエラーになる。
なんでかというと、range関数は、引数に、1個以上3個以下の整数値しか受け取れないから。
data= (50,100,5) (=タプル)に対して、アンパックせずに
range(data) を実行しようとすると、整数値しか受け取れないrange関数に、タプルという「整数値ではない」オブジェクトを渡すことになるから、エラーになる。
*をつけてdataを3つの整数値にアンパックすれば、range関数に3つの整数の引数を渡すことになるから、正常に実行できる。
(「3つ以下の要素を持つタプルを渡したら自動的にアンパックしてくれれば直感的で楽なのにどうしてそうなってないの?」って思うかもしれないけど、そういうものだと割り切るしかない)

0 コメント