前提
ここに書かれているのは他に解説しているサイトがあります。
Pythonの勉強のために個人的にまとめているメモ程度の情報しかありません。
ここではPython3系の話をします。
引数について
ここで扱うのは関数の引数についてです。
私が罠にはまったのでまとめました。
感想
「*」が可変長の引数というのは何となくわかりましたが、
「**」がパラメータ可変長の引数というのは直感的でないように思いました。
なお、詳細は下記のサイトを参照
https://qiita.com/raviqqe/items/ee2bcb6bef86502f8cc6
「*」はポインタではありません。
def foo(*hoge):
""" 引数をプリントするだけの関数
"""
print(hoge)
この場合、「引数にポインタを指定する」関数ではありません。
可変長の引数指定になります。
引数はタプルで取得できます。
foo(1,2,3)
>>> (1,2,3) #実行結果 引数はタプル
リスト内の要素を可変長に渡す場合は”ポインタ”の実態ぽく渡せばよい
bar = [1,2,3]
foo(*bar)
>>> (1,2,3) #実行結果 引数はタプル
「**」はポインタのポインタではありません。
def foo(**hoge):
""" 引数をプリントするだけの関数
"""
print(hoge)
この場合、「ポインタのポインタを渡す」関数ではありません。
パラメータ可変長引数の関数です。
ディクショナリで取得可能です。
foo(a=1,b=2,c=3)
>>> {'a':1,'b':2,'c':3} #実行結果 引数はディクショナリ
ディクショナリをパラメータ可変長引数に渡す場合は”ポインタのポインタ”ぽく渡せばよい
dic={'a':1,'b':2,'c':3}
foo(**dic)
>>> {'b': 2, 'a': 1, 'c': 3}
デフォルト引数の罠
「ミュータブル、イミュータブルについて知っていないとはまっちゃうよ」の典型例
詳細は下記参照
https://qiita.com/yuku_t/items/fd517a4c3d13f6f3de40
デフォルト引数にイミュータブルを指定した場合
def foo(*, x="hoge"):
""" 引数にfugaを加えて返す関数
"""
x+="fuga"
return x
print(foo())
print(foo())
print(foo())
>>>hogefuga
>>>hogefuga
>>>hogefuga
デフォルト引数にミュータブルを指定した場合
def foo(*, x=['hoge']):
""" 引数にfugaを加えて返す関数
"""
x.append('fuga')
return x
print(foo())
print(foo())
print(foo())
>>>['hoge', 'fuga']
>>>['hoge', 'fuga', 'fuga']
>>>['hoge', 'fuga', 'fuga', 'fuga']
リストをデフォルト引数として使う場合は注意しましょう。
というかやんないほうがいい。