何も誇れぬ人生の記録

『ぼくは何も誇れないのが誇りだな』沼田真佑、影裏より

引数の受け渡しについて

一般に引数を使って関数に値を渡す場合、「値渡し」と「参照渡し」の2種類がある。

値渡しはコピーした値を渡す一方、参照渡しは格納されている場所を渡す。

Pythonでは後者の参照渡しが使われる。(プログラム言語ごとに違うので注意

引数にイミュータブルなオブジェクトを指定した場合

タプル、文字列、数値など

def func(n):
    print(id(n))

x = 10
print(id(x))
>> 1407...

func(x)
>> 1407...

イミュータブルなオブジェクトが引数に渡された場合でも参照渡しが行われるが、変更が加わる場合、ほかの番地にコピーが作られる。

def func(n):
  print(n)
  print(id(n))
  n += 3
  print(n)
  print(id(n))

x = 10
print(x)
# >>10

func(x)
# >>10
# >>11531200
# >>13
# >>11531296

print(x)
# >>10

ミュータブルなオブジェクトの場合

リスト、辞書など

def func(n):
  n[0] = 0
  print(id(n))
  print(n)

x = [1, 1]
print(x)
print(id(x))
# >>[1, 1]
# >>1399...936

func(x)
# >>1399...936
# >>[0, 1]

print(x)
print(id(x))
# >>[0, 1]
# >>1399...936
参考

JavaDrive Python入門