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

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

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

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

Q&A

解決済

1回答

618閲覧

配列への格納後に中身が変わってしまうのはなぜなのでしょうか

Yura

総合スコア3

Python

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

0グッド

0クリップ

投稿2023/07/26 11:32

Python初学者です。
以下の①~④の流れで二次元配列を作成したところ、その後に二次元配列を操作していないのに、勝手に値が変わってしまう理由について教えてください。

①二次元配列boxを宣言
box = [["a", "b"]]

②一次元配列tmpを宣言し、二次元配列boxにappend
tmp = ["c", "d"]
box.append(tmp)

③ここまでは期待通りの処理結果が返る
print(box)
→[["a","b"],["c", "d"]]

④一次元配列tmpの0要素を変更すると、二次元配列boxの値も変わる
tmp[0] = "xxx"
print(box)
→[["a","b"],["xxx", "d"]]

改めて質問です。
②で一度、二次元配列boxに格納したのにも関わらず、④にて格納元となった変数の変更を行うと、二次元配列boxにも影響があるのはどうしてなのでしょうか。

また、④の代わりに
tmp = "zzz"
print(box)
とすると、③と同じ[["a","b"],["c", "d"]]となり、二次元配列boxに影響はありませんでしたが、このように二次元配列に影響がない場合と、前述のように影響がある場合の違いについても教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記は当方の環境での実行例です。

Python

1box = [["a", "b"]] 2tmp = ["c", "d"] 3box.append(tmp) 4 5print(id(tmp), id(box[1])) 6# 2060956486080 2060956486080

上記の通り、tmpのid と box[1]の id は同一です。つまり同じオブジェクトを指しています。そのためtmpの内容を変更するとbox[1]の内容も変わります。変わるというよりは同じものを指しているのです。

質問者さんのやりたい事は下記コードで実現できるかと思います。

Python

1import copy 2 3box = [["a", "b"]] 4tmp = ["c", "d"] 5box.append(tmp) 6 7box = copy.deepcopy(box) 8print(id(tmp), id(box[1])) 9# 2060956486272 2060956373312 10 11tmp[0] = "xxx" 12print(box) 13# [['a', 'b'], ['c', 'd']]

「改めて質問です。」については、tmp[0] = "xxx"ではtmpが指すオブジェクトの要素を変更していますが、tmp = "zzz"ではtmpが指すオブジェクトそのものを変更しています。ここで確認すると分かりますが、box[1]tmpの id は異なるものになっています。ですのでboxの内容は変わりません。

投稿2023/07/26 12:07

編集2023/07/26 12:16
meg_

総合スコア10922

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

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

Yura

2023/07/26 12:41

回答いただきありがとうございます! めっちゃ納得できました。さらに、やりたいことまで書いてくださりありがとうございます!! そこら辺の教材よりも見やすくてわかりやすかったです。 昨日からずっと一晩中悩んでいたので解決できてよかったです!!
kazuma-s

2023/07/27 14:13

box[1] と tmp の id を異なるものにしたいのなら、copy.deepcopy を使わず、 box.append(list(tmp)) だけで十分だと思います。
meg_

2023/07/27 15:17

kazuma-sさんへ ご提案ありがとうございます。ベストアンサーは後からでも変更できるかと思いますので、回答として投稿いただけると良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問