pythonのリスト代入が分かりません。

このQ&Aのポイント
  • pythonのリスト代入について分からないことがあります。
  • リストにリストを代入し、一方を変更すると両方が変更される現象について疑問です。
  • なぜリストの一部を変更すると両方のリストに変更が適応されてしまうのか分かりません。
回答を見る
  • ベストアンサー

pythonのリスト代入が分かりません。

pythonの独学をしていまして、 参考書の練習問題を解こうとした際に、 下記のようにプログラムを書いた際に、Temp_new=Temp とリストにリストを代入させた後に、片方だけリストの一部を変更させた際に、両方ともに変更が適応されてしまい、なぜそうなるの分かりません。どなたかどうしてこうなるのかご存じでしょうか? temp=[] temp_new=[] d_time=[8,9,10] cnt=0 for n in d_time: d_add=int(input('Please type temparation data >>')) temp.append(d_add) print('{} o\'clock temparation is {}'.format(d_time[cnt],d_add)) cnt+=1 temp_new=temp temp_new[1]='N/A' print('temp={}'.format(temp)) print('temp_new={}'.format(temp_new)) ※添付ファイルの黄色部分を変えた気が無いのですが、 なぜか変わってしまいます。

  • Python
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • f272
  • ベストアンサー率46% (8021/17145)
回答No.1
shin_okwave
質問者

お礼

理解出来ました。教えていただき、ありがとうございます。

関連するQ&A

  • std::listの代入について

    最近std::listを勉強し始めたのですが質問があります。 あるクラスに以下を用意しました。 メンバ変数 std::list< int > list_int; メンバ関数 void SetListInt( const std::list< int > *temp_list ){ list_int = *temp_list; } 以下質問内容です。 ・この SetListInt 関数の場合 temp_list の先頭のみが代入されますか? ・また, temp_list の元の場所が削除または変更されても list_int の中身(この場合は先頭のみ?)は変わらないですよね? ・引数で貰って中身を全部代入したいならイテレータでfor文を回すしかないのでしょうか? 質問が多く拙文でお恥ずかしいのですが、よろしければご回答お願い致します。

  • python リストのプログラムがうまくいかない

    閲覧ありがとうございます。 学校の講義にてgoogle colaboでpythonを使っています。 課題 複数の記事を読み込んで、行を記事、単語を列とした単語数カウントの行列を作成せよ (ファイルは 単語:単語数 単語:単語数... で、行末尾にnegativeとなっていて、1行に1記事ずつ入っている) import numpy as np import matplotlib.pyplot as plt with open('/content/drive/MyDrive/train.processed') as f: articles = f.readlines() # 記事を読み込む list_articles = [] # 記事単位のリスト list_words = [] # 単語単位のリスト list_count = [] # 単語数カウントの行列 x = len(articles) for article in articles: list_articles.append(article.split()) # 記事ごとに[単語:単語数]で配列に入れる(二次元) for i in range(x): # x=記事数 for j in range(len(list_articles[i])-1): # negativeを除いた1記事当たりの単語数 if not '::' in list_articles[i][j]: # 単語として[:]があるとバグるのでない場合のみ処理を行う(::3みたいになってる) col = list_articles[i][j].find(':') # 単語と単語数の間の:の位置を求める word = list_articles[i][j][:col] # コロン未満(単語部分)をwordに代入する if not word in list_words: # list_wordsにない場合、追加する list_words.append(word) list_count.append([0 for k in range(x)]) # 記事数分のリストを追加する(行列に1行追加) list_count[i][list_words.index(word)] = int(list_articles[i][j][col+1:]) # 何記事目かを行、何の単語かを列として単語数を代入 print(word) list_count[i][list_words.index(word)] = int(list_articles[i][j][col+1:]) ここでIndex out of rangeが出ます。print(word)で途中まで出力されるので、エラーが起きながら動いていたのか、途中でエラーが起きて止まったのかもわかりません。 色付きのプログラムを写真に添付します。 かなり時間をかけて考えたのですが、理解できなかったので質問させていただきました。 よろしくお願いします。

  • PythonでUTF8の文字列をリストに入れると文字化けする

    PythonでUTF8の文字列をリストに入れると文字化けして、困っています。 以下、サンプルコードです。 a='あ' print a cmd=[] cmd.append(a) print cmd 結果は以下のようになります。 あ ['\xe3\x81\x82'] 文字化けしないようにリストに格納するにはどうすればよいでしょうか。 また、最終的にやりたいことは、リストの内容をLinuxのコンソールに出力することです。 Linux上で、$'\xe3'$'\x81'$'\x82'とすると'あ'という風に認識してくれるので、このようにリストに格納されれば良いと思っているのですが、良い方法はあるでしょうか。 よろしくお願いします。

  • Python: matrix追加でNoneの理由

    下記の#入力とPython #コード の実行で、「出力結果」が出ます #▼Aのところで、 matrix.append(d) を可視化しようとしたら None しか返りません 想像では入力の2行目以降が順次追加されていくイメージを想像していました [[11, 14, 16, 9]] [[11, 14, 16, 9], [11, 14, 16, 9]]  : 質問: 1)この#▼Aの下の行でNoneしか返らない理由をおしえてください 2)matrixに追加されて形成される行列は、単純にメモリ上で形成されていると考えていいですか? #入力 3 11 14 16 9 13 15 19 10 10 11 14 11 #コード N = int(input()) # 空のリストを作成 matrix = [] for i in range(N): # 入力を受け取り、リストに変換 d = list(map(int, input().split())) # リストをmatrixに追加 matrix.append(d) #▼Aここでmatrixを可視化しようとした print(matrix.append(d)) print(app) #▼Bここでもmatrixを可視化しようとした print(matrix) # 1行目の要素0 first_element = matrix[0][0] print(first_element) #11 #==出力結果================== None None None None None None [[11, 14, 16, 9], [11, 14, 16, 9], [13, 15, 19, 10], [13, 15, 19, 10], [10, 11, 14, 11], [10, 11, 14, 11]] 11

  • Python リスト内の要素取り出しについて

    ProgateでPythonを1から学んでいる初心者です。 現在、じゃんけんゲーム作成のセクションに取り組んでいるのですが、その中でリストの要素取り出しについて疑問点があるため質問いたしました。 詳しくは画像を参照いただければ分かりやすいかと思うのですが、 ------------------------------ def print_hand(hand, name='ゲスト'): # 変数handsに、複数の文字列を要素に持つリストを代入してください hands = ("グー", "チョキ", "パー") # リストhandsを用いて、選択した手が出力されるように書き換えましょう print(name + 'は' + hands[hand] + 'を出しました') ------------------------------- という点に関して、なぜ hands[hand] でリスト「hands」内の要素が取り出せるのか分かりません。 この時点では、「hand」が「hands」内の要素に対応していることは、明示されていなくないですか? グーが0、チョキが1、パーが2に対応することは分かっているのですが。。。 ずぶの素人質問で申し訳ございませんが、ご教授お願いいたします。

  • python 代数を定義

    list = ['a', 'b', 'c', 'd'] X = list .pop() print(list) このコードを実行すると、print(list) の結果として ['a', 'b', 'c'] が得られることになります。 しかし私としては、['a', 'b', 'c', 'd']とならないのが不可解なのです。 なぜなら、2行目の X = list .pop() は代数Xを定義しているにすぎず、リストであるlistには影響を与えていないと思うのです。 (print(X) が ['a', 'b', 'c'] となれば納得するのですが、もちろんこの答えはdとなります。) pythonの文法上なぜこうなるのか教えて頂きたいです。

  • pythonのメゾッドの整合性について

    こんばんは。 pythonを勉強し始めましたが理解できない部分があって質問させて頂きます。 プログラム、特にオブジェクト指向をまだよく理解していないのである程度初心者向けの回答をお願いします。 pythonにおいて文字列はオブジェクトであり、 >>> strA = "python" >>> print (strA) python >>> print (strA.upper()) PYTHON >>> print (strA) python のように使われるメゾッドが存在しています。 これはオブジェクト自体を変化させるのではなく、今回の場合ではオブジェクトがupper()されたオブジェクトを返しています(まちがっていませんよね?)。 そのため、strA自体を変化させるには >>> strA = strA.upper() >>> print (strA) PYTHON のようにする必要があると理解していました。 ここで新しいオブジェクトlistを用いた時 >>> tl = ['A','B','C','D','E','F'] >>> print (tl) ['A', 'B', 'C', 'D', 'E', 'F'] >>> print(tl.reverse()) None >>> print(tl) ['F', 'E', 'D', 'C', 'B', 'A'] >>> listA.reverse() となります。文字列から類推すると >>>tl = ['A','B','C','D','E','F'] >>>print (tl.reserve()) ['F', 'E', 'D', 'C', 'B', 'A'] >>>print(tl) ['A','B','C','D','E','F'] >>>tl =tl.reserve() >>>print (tl) ['F', 'E', 'D', 'C', 'B', 'A'] のような振る舞い方を行うのが"正しい"と思うのですがなぜ違うのでしょうか?

  • python超初心者です(3時間目)。pythonで以下のようなランダ

    python超初心者です(3時間目)。pythonで以下のようなランダム数列を生成させるにはどうしたらいいのでしょうか? 最終結果のイメージ(16進数8桁の数列x20行): 0 : c39a29eb 1 : b26cc9bb 2 : 4c494e47 ... 19: 93c85836 以下のようにコードを組んでみたのですが、 > tmp = ws.join(list) > TypeError: sequence item 0: expected string, int found のようなエラーが出てしまいます。どうやら数字を連結しようとしてるのでダメなのかな?と思っています。 ======================================== #! /usr/bin/python import random list = [] ws = "" for i in range (20): print i, ":", for j in range(8): list.append(random.randint(0,15)) tmp = ws.join(list) print tmp list = [] tmp = "" ======================================== ※ printでは必ずスペースが入ってしまうので、それを嫌う場合配列に入れて、要素を連結させなくてはならない、とwebにあったので、その方向で試してみました。 ※ また、ここではあくまでrandom を使用し、一文字(0,1,2,...E,F)づつ出力させたいと思っています。 なお、perlでは以下のように書くことができたのですが... ======================================== #! /usr/bin/perl for($i=0; $i<20; $i++){ printf ("%-02s: ", $i); for($j=0; $j<8; $j++){ printf("%x", int(rand(15)) ); } print "\n"; } ======================================== ※ んー第二言語としてpythonを学習してみていますが道のり険しそうです(やっぱrubyにしようか)... 宜しくお願い致します。

  • pythonのprint文のようなfprint文?

    pythonのprint文(format有無とも)の通りにファイル書き込みをする文はありませんか。c言語のprintf文とfprintf文のような関係です(ファイルポインタだけが付く)。目的は既存のpythonのソースのprint文をすべてファイルに書き込みたいのです。write文で行うのは変更が大変ですのでうまいものがないかと。 ちょっと検索した範囲では見つからなかったので望み薄ですが。

  • C#.NET ArrayListの使用方法について

    C#.NETを使用しています。ArrayListを宣言、インスタンス化し、 "別々の値を持つ"要素20個をAdd(追加)しているはずなのですが、 要素を取り出して、値を見てみると"同じ値"になってしまっています。 自分なりに考えたのですが原因がわかりません。 どなたかご教授お願いします。 書いたソースは以下のような感じです。 public class Area{ _____// リスト _____public ArrayList list; _____//コンストラクタ _____public Area(){ _________ list = new ArrayList(); __________//要素の作成は以下で行う __________for(int cnt=0;cnt<20;cnt++){ ___________ AddNodeList(new 要素); } _____} _____public void AddNodeList(要素){ _______要素型 a = 要素; _______list.Add(a); _____} }