2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C++erに送るPythonの関数引数について

2
Last updated at Posted at 2018-01-07

前提

ここに書かれているのは他に解説しているサイトがあります。
Pythonの勉強のために個人的にまとめているメモ程度の情報しかありません。

ここではPython3系の話をします。

引数について

ここで扱うのは関数の引数についてです。
私が罠にはまったのでまとめました。

感想
「*」が可変長の引数というのは何となくわかりましたが、
「**」がパラメータ可変長の引数というのは直感的でないように思いました。

なお、詳細は下記のサイトを参照
https://qiita.com/raviqqe/items/ee2bcb6bef86502f8cc6

「*」はポインタではありません。

sample.py

def foo(*hoge):
    """ 引数をプリントするだけの関数
    """
    print(hoge)

この場合、「引数にポインタを指定する」関数ではありません。
可変長の引数指定になります。
引数はタプルで取得できます。

sample2.py

foo(1,2,3)
>>> (1,2,3) #実行結果 引数はタプル

リスト内の要素を可変長に渡す場合は”ポインタ”の実態ぽく渡せばよい

sample2.py
bar = [1,2,3]
foo(*bar)
>>> (1,2,3) #実行結果 引数はタプル

「**」はポインタのポインタではありません。

sample3.py
def foo(**hoge):
   """ 引数をプリントするだけの関数
   """
   print(hoge)

この場合、「ポインタのポインタを渡す」関数ではありません。
パラメータ可変長引数の関数です。
ディクショナリで取得可能です。

sample4.py

foo(a=1,b=2,c=3)
>>> {'a':1,'b':2,'c':3} #実行結果 引数はディクショナリ

ディクショナリをパラメータ可変長引数に渡す場合は”ポインタのポインタ”ぽく渡せばよい

sample5.py

dic={'a':1,'b':2,'c':3}
foo(**dic)
>>> {'b': 2, 'a': 1, 'c': 3}

デフォルト引数の罠

「ミュータブル、イミュータブルについて知っていないとはまっちゃうよ」の典型例

詳細は下記参照
https://qiita.com/yuku_t/items/fd517a4c3d13f6f3de40

デフォルト引数にイミュータブルを指定した場合

sample6.py

def foo(*, x="hoge"):
    """ 引数にfugaを加えて返す関数
    """ 
    x+="fuga"
    return x

print(foo())
print(foo())
print(foo())

>>>hogefuga
>>>hogefuga
>>>hogefuga

デフォルト引数にミュータブルを指定した場合

sample7.py
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']

リストをデフォルト引数として使う場合は注意しましょう。
というかやんないほうがいい。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?