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

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

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

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

Q&A

解決済

3回答

698閲覧

Pythonに関する質問

G-33

総合スコア1

Python

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

0グッド

0クリップ

投稿2020/11/14 14:00

前提・実現したいこと

pythonを初めて1か月です.
自分でプログラムを組んでいるときに下記の様な出力が出ました.
z1は意図的にリストの入れ替えをしているのですが,それに加えてxも入れ替わっていました.なぜ,xが入れ替わっているのかがわかりません.
教えていただけると幸いです.

pythonのコード

x=[[1,2,3],[4,5,6],[7,8,9]]
z1=x
a=z1[0]
b=z1[2]
z1[0]=b
z1[2]=a
print(x)
print(z1)

出力結果

[[7, 8, 9], [4, 5, 6], [1, 2, 3]]
[[7, 8, 9], [4, 5, 6], [1, 2, 3]]

ソースコード

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

miyabi_takatsuk

2020/11/14 14:06 編集

オブジェクト(今回はリストのことです)と、 プリミティブな値(数値や文字列などです)は、変数に代入した際に挙動が違う、ということは理解されていますか?
G-33

2020/11/14 14:11

連絡ありがとうございます.上記の内容については理解していません.
miyabi_takatsuk

2020/11/14 14:31

まず、そこの理解が必要ですね。 Python オブジェクト 代入 とかで調べて、学習を進めた方がいいかと。
guest

回答3

0

変数名って「看板」みたいなものなのですよね。

簡単な内容ならば看板に少し補足を書くだけでよいのですか、今回の例のような複雑な内容だと、建物に看板が付いているみたいな構造になっています。z1=xというのは、この建物はxビルだけど、z1株式会社とも呼ぶことにする!という意味合いです。そこで、z1株式会社の中に入っているお店をファミマからセブンに変えてみた、というのがz1の中身を入れ替えたっていうものです。すると不思議、何も変更していないはずのxビルの方も、お店がファミマからセブンに変わっているぞ!というのが、今回の現象です。

なぜそんなしくみになっているのか?と思いますよね。やっぱり建物を丸ごと新しく建てるにには時間(CPU)もかかるし、場所(メモリ)も食うし、ということで、大体の場合は、建物はそのままで看板だけつければいいや!ってなったんです。それでも、たまには建物をそっくりそのまま新しく建てた方が使いやすい!っていう場合もあって、そういう命令もできるようにはなっています。

投稿2020/11/14 14:37

編集2020/11/14 14:46
toast-uz

総合スコア3266

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

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

G-33

2020/11/15 00:30

回答ありがとうございます.別の名前を使っているけど,結果的に見ているところは同じという理解でいいでしょうか?分かりやすく説明してくださってありがとうございます.イメージしやすくなりました.
toast-uz

2020/11/15 00:32

そのご理解で大丈夫です。
guest

0

ベストアンサー

今回は、参照に関しての理解が必要不可欠です。

行ごとに、何が起きているか解説します。

python

1x=[[1,2,3],[4,5,6],[7,8,9]] 2# まず、各値(1とか2の数値自体)がメモリに保持される 3# その値を参照する、リストが生成され、メモリに保持される。 4# ↑リストは、リストのインデックスに値参照を保持できる 5# 最終的には、そのリスト群を、またさらに囲うリストがメモリに保持され、xは、その親リストの参照となる 6 7z1=x 8# z1には、xが入るのではなく、 9# xが参照していた、リストオブジェクトの参照が入る 10# (z1と、xは同じオブジェクトを参照しているが、両者は関係を持たない) 11 12a=z1[0] 13# aは、[1,2,3]というリストオブジェクトの参照となる(z1[0]と、aは関係性を持たない) 14 15b=z1[2] 16# 上記同(代入されたオブジェクト自体は違う) 17 18z1[0]=b 19# z1が参照している(xも参照している)リストオブジェクトの0インデックスの参照オブジェクトを、bが参照している、[7,8,9]のリストオブジェクトに変更。 20 21z1[2]=a 22# 上記同 23 24print(x) 25print(z1) 26# z1も、xも両方が参照している元のオブジェクトの参照値自体を変更したため、両方の内容が変化したようになる 27# あくまで、両方が変化したのではなく、参照していた元オブジェクトが変化した

いきなり二次リスト(今回のように、リストの中にリストが入ってるようなやつ)だと、理解するのは大変だと思うので、
まず、一次リストから、いろいろやってみることを勧めます。

投稿2020/11/14 14:29

miyabi_takatsuk

総合スコア9555

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

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

G-33

2020/11/14 14:42

細かく解説ありがとうございます.プリミティブとオブジェクトの考え方がしっかりと分かっていないということは分かりました.ぼんやりとですが,理解はできたのかなと思います.最後にコメントにあるように一次リストからいろいろと考えてみます.ご回答ありがとうございました.
miyabi_takatsuk

2020/11/14 14:45

値と参照に関しては、 プログラミングの基本なのですが、 細かくやると、中級から上級の登竜門になります。 なので、初学のうちは、 オブジェクトは代入したらこういう動きするぞ、こういうもんなんだ・・・ で止めた方がいいかもですね。
guest

0

x=[[1,2,3],[4,5,6],[7,8,9]]

z1=x

だと、xの指すオブジェクトとz1の指すオブジェクトは同一です。

別のオブジェクトにしたければコピーを作成することが必要です。

Python

1import copy 2 3x=[[1,2,3],[4,5,6],[7,8,9]] 4z1=copy.deepcopy(x)

投稿2020/11/14 14:24

otn

総合スコア85901

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

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

G-33

2020/11/14 14:43

回答ありがとうございました.上記のプログラムの使い方参考にさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問