値渡しと参照渡し

問題1

次のプログラムを実行すると、どのような出力になるでしょうか。

[Google Colaboratory]

1
2
3
4
5
6
7
8
x = 10
def calc(x):
x += 20
return x

print(x)
print(calc(x))
print(x)

解説1

関数calc内で変数xに加算していますが、グローバル宣言されていないため、ローカル変数として処理されます。

引数としてxが指定されているため、呼び出された時点でのxの値が使われ、その値に20を加算して返します。

最初のxは初期設定された10が出力され、次のcalc(x)では引数の10に20を加算した30が出力されます。

最後のxは関数calcによって変更されることはないため、初期設定された10がそのまま出力されます。

[実行結果1]

10

30

10

問題2

次のプログラムを実行すると、どのような出力になるでしょうか。

[Google Colaboratory]

1
2
3
4
5
6
7
8
a = [10]
def calc(a):
a[0] += 20
return a

print(a)
print(calc(a))
print(a)

解説2

関数calc内では、引数で渡された変数aのリストにおける先頭の要素の値に20を加算して返しています。

引数としてリストが渡された場合は、参照渡しであるためそのリストの内容を書き換えます。

最初のaは初期設定されたリスト[10]が出力され、次のcalc(a)では引数のリストにおいて先頭の要素に20を加算したリスト[30]が出力されます。

最後のaは関数calcによって変更されているため、変更されたリスト[30]が出力されます。

[実行結果2]

[10]

[30]

[30]

問題3/span>

次のプログラムを実行すると、どのような出力になるでしょうか。

[Google Colaboratory]

1
2
3
4
5
6
7
8
a = [10]
def calc(a):
a = [20]
return a

print(a)
print(calc(a))
print(a)

解説3

関数calc内では、引数で渡された変数aのリストを書き換えて返しています。

引数としてリストが渡された場合は、参照渡しですがその内容を書き換えているだけであり元のリストは上書きされません

最初のaは初期設定されたリスト[10]が出力され、次のcalc(a)では書き換えられたリスト[20]が出力されます。

最後のaは関数calcによって変更されることはないため、初期設定されたリスト[10]が出力されます。

[実行結果3]

[10]

[20]

[10]