省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

辞書型変数を戻り値に使用しようとして失敗 - Python Tips

 Pythonでは辞書型変数を関数の引数に使用することができます。

例えば、次のような関数を設定します

def routine1(x, dic1):

 中身

    return a....

この時、dic1 は辞書型変数だとします。

 

これをメインでdic1の中身を定義し(例えば dic1 = {"Key1":1, "Key2":2, "Key3":3}) など)、次のように呼び出すと

return_value = routine1(x, dic1)

 

def toutine の中で、しっかり dic1を参照することができます。

例えばdic1の中身が

"key1": 1

"key2": 2

"key3": 3

だと呼び出し元で定義されていたすると

def routine の中でも dic1["key2"] の値は 2 になります。

-----------------

で、てっきりこの逆ができるものと錯覚していました。つまり例えば...

def routine2()

 dic2 = {"key1":1, "key2":2, "key3":3 }

 その他中身

 return b, dic2

として、中身の部分で 辞書変数dic2の内容を入れておきます。

※ここではbは通常の変数、dic2は辞書型変数とします

 

これを呼び出し元から

b, dic2  = routine2()

と呼び出せば、呼び出し元で dic2 の中身を参照できるものと思っていました。ところが実際にやると失敗します。

 

結局どうしてもやりたければ、以下のようにやるしかないようです。

def routine2()

 中身

 return b, dic2["key1"], dic2["key2"], dic2["key3"]

 

そして呼び出し元でも予めkey2を定義しておいて、要素ごとにばらして受けます。

dic2 = {"key1":0, "key2":0, "key3":0, }

b, dic2["key1"], dic2["key2"], dic2["key3"]  = routine2()

これなら、toutine2 で定義した辞書型変数の中身を呼び出し元に引き渡すことができます。

 考えてみると辞書型変数は、インデックス番号で中身を呼び出すことができません。ですので return で戻しても順番通り中身を呼び出し元に引き渡す、ということができないようです。従って、失敗する模様です。

---------

 但し、戻り値を辞書型で引き渡す方法はないわけではないようです。ネットで調べたらこのような形なら可能なようです。

def routine3(a):
 中身
  return {"key1":b,"key2":c,"key3":d}

 

そして、呼び出し元からは次のように呼び出します。

dic3 = routine3(a)

ただ、この場合おそらく、いくつかのタイプの変数を混在させて引き渡すのは困難かと思います。

----------

 おそらく私と同様な錯覚をする人がいると思われますので、ここにメモを記します。もし間違いがありましたらご指摘いただくと幸いです。

ーーーーーーーー

[追記]

 その後、単独の辞書変数なら戻り値として使用できることが分かりました。辞書型変数と非辞書型変数を混在させて戻り値に使用したり、複数の辞書型変数を戻り値に使用しようとすると無理なようです。