これは、pythonのはまりどころでもあるし、勘所でもあります。まず何が起きているか説明してみます。
まずは以下のコードの動作は把握されていますか?
python
1list_x = [1, 2, 3]
2
3A = list_x
4B = list_x
5
6print(A)
7# [1, 2, 3] と表示
8print(B)
9# [1, 2, 3] と表示
10
11list_x[0] = 10
12
13print(A)
14# [10, 2, 3] と表示
15print(B)
16# [10, 2, 3] と表示
17
このように、list_x、A、B はすべて「同じリストを指して」います。 pythonで「A = list_x」のような記述をすると、Aはlist_xと同じものを指すようになるのです。
また、ここで扱われている、1つしかない「リスト」は、 「list_x = [1, 2, 3]」の部分で生成されています。
さて、問題のコードを関数を使わずに書くと以下のようになります。
python
1
2list_x = []
3
4# A = list_in(1, 2, 3)
5list_x.clear()
6list_x.append(1)
7list_x.append(2)
8list_x.append(3)
9A = list_x
10
11#B = list_in(4, 5, 6)
12list_x.clear()
13list_x.append(4)
14list_x.append(5)
15list_x.append(6)
16B = list_x
17
18print(A)
19print(B)
20
ここでも同様に、1つしか作られていないリストをlist_x、 A、Bで共有していることがわかります。
どのようにすれば望みの結果になるかについてですが、
python
1def list_in(num1, num2, num3):
2 list_x.clear()
3 list_x.append(num1)
4 list_x.append(num2)
5 list_x.append(num3)
6 return list_x
この関数は、「この関数の外で定義されているlist_xの内容を空にし、引数の数を設定して返す」という関数になっていますので、そもそも当初の目的に合っていないと思います。 また、このように、実行することで「副作用 (引数に関係の無い値を変更してしまうこと)」を起こすような関数は使わない流れになってきているので、これをベースに考えないほうがいいでしょう。
「新しいリストを作って、引数の値を設定して返す」関数にするのはいいのではないでしょうか。
既存の書き方に寄せるとこんな感じです。
python
1def list_in(num1, num2, num3):
2 list_new = []
3 list_new.append(num1)
4 list_new.append(num2)
5 list_new.append(num3)
6 return list_new
この場合、list_xは使いませんが。
コメントへの補足で追記します。
「A,B がlist_xを参照している」のではないことは、以下のコードで確認できます。
python
1list_x = [1, 2, 3] # 1
2
3A = list_x
4B = list_x
5
6print(A)
7# [1, 2, 3] と表示
8print(B)
9# [1, 2, 3] と表示
10
11list_x = [10, 20, 30] # ★
12
13print(A)
14# [1, 2, 3] と表示
15print(B)
16# [1, 2, 3] と表示
★のところで、list_xは「新しく作られたリスト」を参照するように変えられましたが、A, Bはlist_xではなく、もとの 1 で作られたリストを参照しているので値は変りません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/21 09:54
2021/03/21 10:03
2021/03/21 10:03
2021/03/21 10:11
2021/03/21 10:25 編集