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

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

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

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

3回答

4259閲覧

for文で変数が勝手に更新されてしまう

UmiH

総合スコア2

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2020/05/31 14:23

編集2020/05/31 14:52

実現したいこと

言語はPythonです。
次のようなコードを実行したのですが、思うように動きません。
原因がわからないので、ご教示よろしくお願いいたしますm(_ _)m
以下のコードで次のような出力を得たいです。

Python

1#求めている出力結果 2A=[] 3a=[0] 4A=[] 5a=[1] 6A=[] 7a=[2]

該当のソースコード

Python

1a=[] 2A=[] 3lis=[0,1,2] 4for i in lis: 5 a=A #aにA=[]を代入 6 print("A={}".format(A)) 7 a.append(i) #リストa=[]にi(=0,1,2)を追加 8 print("a={}".format(a)) 9 10#出力結果 11#A=[] 12#a=[0] 13#A=[0] 14#a=[0, 1] 15#A=[0, 1] 16#a=[0, 1, 2]

・補足
'a'にA=[]を代入することで、forループするたびにa=[]となることを望んでいるのですが、'A'がA=[]で固定されているはずなのに、出力結果にあるように勝手に変化している理由がわかりません。

試したこと

Jupyterlab実行時に上記の問題が発生。ターミナルのipython3でも同様に実行しましたが、問題は解決しませんでした。

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

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

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

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

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

y_waiwai

2020/05/31 14:30

あなたの考える正解とはどういう出力なんでしょうか
UmiH

2020/05/31 14:54

私が求めている出力は、質問文「実現したいこと」の#求めている出力結果 にございます。
guest

回答3

0

ベストアンサー

a = A と書くとき、オブジェクトはコピーされません。
aが『指し示す先』がAと同じになるだけです。

Python

1A = [] 2a = A 3 4a.append(1) 5print(A) # => [1]と出力される

実行 Visualize Python, Java, JavaScript, C, C++, Ruby code execution

実際の画面


原因がわからないので、ご教示よろしくお願いいたしますm(_ _)m

実際に動作を観察してみるとその理由に納得がいくかもしれません。
リンク先に飛ぶと1ステップずつ処理を進められるので、観察してみて下さい。
Visualize Python, Java, JavaScript, C, C++, Ruby code execution

実際の画面

投稿2020/05/31 14:48

編集2020/05/31 15:00
LouiS0616

総合スコア35668

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

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

UmiH

2020/05/31 15:20

とても詳しく、そしてわかりやすく答えていただきありがとうございますm(_ _)m 何が原因だったのか理解できました!'a'と'A'の箱が同じものになってしまっていたのですね、、、 初めてobjectの概念を考慮しなければいけない場面に出くわしました。。
UmiH

2020/05/31 15:22

もう少しお付き合いしてくださいませんでしょうか?? 'A'を更新することなく、元の配列を保持したまま'a'に代入するにはどのような方法があるのでしょうか、、?お時間ございましたらお知恵をいただきたいです。
LouiS0616

2020/05/31 15:28 編集

Aの値が空リスト固定なのであれば、一番単純なのはループ内で a = [] することです。 そうじゃなかったら a = A.copy() ですかね。回答で紹介したサイトで実際に試してみると、視覚的にも受け入れやすいと思います。
UmiH

2020/05/31 17:28

ありがとうございます!やりたかったことができました。 ほんとうに助かりましたm(_ _)m
guest

0

a=Aで、aAは同じオブジェクトを指しているので、a.append(i)で「そのオブジェクト」に追加していますので、変数から見るとaにもAにも追加していることになります。

単純化すると、

Python

1A=[] 2a=A 3a.append(1) 4print(A) 5print(a)

変数への代入と、オブジェクトの加工を混同しないようにしましょう。

投稿2020/05/31 14:56

otn

総合スコア85901

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

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

UmiH

2020/05/31 17:30

ご返答くださりありがとうございますm(_ _)m オブジェクトという概念が大事だということを認識させられました、、
guest

0

ループ回るごとに aに[]入れてるんで、そういう結果になって当然です。

どういう結果になるとお思いでしょうか

投稿2020/05/31 14:32

y_waiwai

総合スコア88042

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

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

LouiS0616

2020/05/31 14:48

> ループ回るごとに aに[]入れてる そんなわけないでしょう。実行してみましたか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問