BETA

Python デフォルト引数のワナ

投稿日:2020-01-05
最終更新:2020-01-05

変数を再代入してるのに、値が変わっていない!?

DIVE INTO EXAMで模擬テストをしていて分からなかったのがこのコード
結果は10です

i = 10  

def num(arg=i):  
    print(arg)  

i = 7  

num()  

num()で関数を呼び出す直前にi=7で再代入しているのに、なんで10なの???

デフォルト引数は関数の定義時にセットされて、再代入されない

Python♪引数のディフォルト値が変化する場合と変化しない場合の違い
Pythonのコードは上から順番に読み込まれるので、
上のコードだとdef num(arg=i):の時点でのiの値がデフォルト引数の値としてセットされるのか!
(そしてデフォルト引数はfinal変数)

iがリストだったら再代入できてしまう!?

デフォルト引数がリスト(mutable:変更可能オブジェクト)だと値が書き換えられる!
以下のコードを実行すると7が表示されます

i = [10] # iはリスト  

def num(arg=i):  
    print(arg[0]) # 最初の要素を表示  

i[0] = 7 # 最初の要素を変更  
# i = [7] だと結果は10のまま  

num()  

デフォルト引数は「(関数定義時に)代入された変数オブジェクトへのリンク」だから、
代入された変数オブジェクト自体に対してfinal変数扱い

リストはi[0]でリストiの最初の要素へのリンクとなっている
代入された変数オブジェクトがリストだと、リスト自体までがfinal変数(デフォルト引数)で
リストの要素はデフォルト引数には含まれていないのか

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう