質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

635閲覧

Python リストを引数にして、コピーされた値を呼び出し元で参照したい場合について

lemonesour

総合スコア25

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/06 09:56

■環境
Python2.4.3

■試したこと
#リスト更新関数
def update(arg_test_list):
update_list = [[1,2],[3,4]]
arg_test_list = update_list
print(arg_test_list ) #処理1

#呼び出し元
def main():
test_list = []
update(test_list) #リスト更新関数Call
print(test_list) #処理2

■結果
[[1,2],[3,4]] #処理1の結果
[]       #処理2の結果

■期待する結果
[[1,2],[3,4]] #処理1の結果
[[1,2],[3,4]] #処理2の結果

リストを更新する関数に引数としてリストで渡し、関数内で更新されたリストを呼び出し元で参照できるようにしたです。
お手数ですが、ご教授のほど、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こういう場合は、extendを使うのが適しています。

python

1def update(arg_test_list): 2 update_list = [[1,2],[3,4]] 3 arg_test_list.extend(update_list) 4 print(arg_test_list ) #処理1 5 6def main(): 7 test_list = [] 8 update(test_list) #リスト更新関数Call 9 print(test_list) #処理2

実行結果

python

1>>> main() 2[[1, 2], [3, 4]] 3[[1, 2], [3, 4]]

参考

Pythonでリスト(配列)に要素を追加するappend, extend, insert

投稿2021/12/06 10:38

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lemonesour

2021/12/06 10:47

ppaul様 いつもご教授ありがとうございます。 問題が解決しました。 extendにたどり付けなかった事は私はまだまだ勉強不足です。。 今後ともご指導ご鞭撻のほど、よろしくお願いいたします。
guest

0

Python

1def update(arg_test_list): 2 update_list = [[1, 2], [3, 4]] 3 arg_test_list.append(update_list) 4 5 6def main(): 7 test_list = [] 8 print(test_list) 9 update(test_list) 10 print(test_list)

こんな感じでいかがでしょうか?
初めのソースコードに「print(id(変数名))」を使用することでオブジェクトID(Cで言うポインタみたいなもの)を確認することができます。
すると
arg_test_list = update_list
とした場合だとこれをする前と後ではarg_test_listのIDが変わってしまっている(別物になっている)ことがわかります。
しかしappend()を使用するとIDは変わっていません。
IDをもとに値を参照しているためIDが変わるとprint()で表示される値も変わってしまいます(今回の場合だと変わらないんですが...)

ちなみにappend()を使わずに、こんな感じでも同じ結果が得られます。

Python

1def update(arg_test_list): 2 update_list = [[1, 2], [3, 4]] 3 arg_test_list[0] = update_list[0] 4 arg_test_list[1] = update_list[1] 5 6 7def main(): 8 test_list = [0, 0] 9 print(test_list) 10 update(test_list) 11 print(test_list)

main()のtest_listで値を入れているのはupdateの方で要素を選択する必要があり、元のソースコードだと要素数が0であるためエラーが出てしまいます。
その点append()だと要素をついかできるためエラーが出ません。

投稿2021/12/06 10:20

syoshinsya-

総合スコア21

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lemonesour

2021/12/06 10:33 編集

syoshinsya-様 早々に回答いただきありがとうございます。また丁寧な解説大変助かります。 appendを使用すると以下の結果になります。 ■結果 [[[1,2],[3,4]]] #処理1の結果 [[[1,2],[3,4]]] #処理2の結果 []が1セット多くなってしまいます。 [[1, 2], [3, 4]]でコピーする方法はご存じでしょうか?
syoshinsya-

2021/12/06 10:47

そうですね????すみません apoendは配列の最後に要素を追加するので [[1, 2], [3, 4]]の場合は [1, 2]と[3, 4]の2回に分けてappendする必要がありました。 ここのサイトが例もあってわかりやすいかも知れません https://note.nkmk.me/python-list-append-extend-insert/
guest

0

スライスに対して挿入を行う方法も考えられます。

python

1#リスト更新関数 2def update(arg_test_list): 3 update_list = [[1,2],[3,4]] 4 arg_test_list[len(arg_test_list):] = update_list 5 print(arg_test_list) #処理1 6 7#呼び出し元 8def main(): 9 test_list = [] 10 update(test_list) #リスト更新関数Call 11 print(test_list) #処理2 12 13main() 14 15# 16[[1, 2], [3, 4]] 17[[1, 2], [3, 4]]

投稿2021/12/06 11:22

編集2021/12/06 11:27
melian

総合スコア19865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問