代入による渡し方

Python関数の書き方

Shayne Miel

Software Architect @ Duo Security

意外な例

def foo(x):
  x[0] = 99

my_list = [1, 2, 3]
foo(my_list)
print(my_list)
[99, 2, 3]
def bar(x):
  x = x + 90

my_var = 3
bar(my_var)
print(my_var)
3
Python関数の書き方

さらに深掘り

RAM

Python関数の書き方

さらに深掘り

a = [1, 2, 3]

a を設定

Python関数の書き方

さらに深掘り

a = [1, 2, 3]

b = a

b は a

Python関数の書き方

さらに深掘り

a = [1, 2, 3]

b = a
a.append(4)
print(b)
[1, 2, 3, 4]

a に追加

Python関数の書き方

さらに深掘り

a = [1, 2, 3]

b = a
a.append(4)
print(b)
[1, 2, 3, 4]
b.append(5)

print(a)
[1, 2, 3, 4, 5]

b に追加

Python関数の書き方

さらに深掘り

a = [1, 2, 3]

b = a
a.append(4)
print(b)
[1, 2, 3, 4]
b.append(5)

print(a)
[1, 2, 3, 4, 5]
a = 42

a は 42

Python関数の書き方

代入による渡し方

def foo(x):
  x[0] = 99

RAM

Python関数の書き方

代入による渡し方

def foo(x):
  x[0] = 99

my_list = [1, 2, 3]

my_list を設定

Python関数の書き方

代入による渡し方

def foo(x):
  x[0] = 99

my_list = [1, 2, 3]
foo(my_list)

foo() を呼び出し

Python関数の書き方

代入による渡し方

def foo(x):
  x[0] = 99

my_list = [1, 2, 3]
foo(my_list)
print(my_list)
[99, 2, 3]

x と my_list を更新

Python関数の書き方

代入による渡し方

def bar(x):
  x = x + 90

my_var = 3

my_var

Python関数の書き方

代入による渡し方

def bar(x):
  x = x + 90

my_var = 3
bar(my_var)

bar() を呼び出し

Python関数の書き方

代入による渡し方

def bar(x):
  x = x + 90

my_var = 3
bar(my_var)
my_var
3

x を新しい値に代入

Python関数の書き方

イミュータブルかミュータブルか?

イミュータブル

  • int
  • float
  • bool
  • string
  • bytes
  • tuple
  • frozenset
  • None

ミュータブル

  • list
  • dict
  • set
  • bytearray
  • オブジェクト
  • 関数
  • ほぼその他すべて
Python関数の書き方

ミュータブルなデフォルト引数は危険!

def foo(var=[]):
  var.append(1)
  return var

foo()
[1]
foo()
[1, 1]
def foo(var=None):
  if var is None:
    var = []
  var.append(1)
  return var

foo()
[1]
foo()
[1]
Python関数の書き方

練習しましょう!

Python関数の書き方

Preparing Video For Download...