• 締切済み

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の文法上なぜこうなるのか教えて頂きたいです。

  • fisica
  • お礼率77% (235/305)
  • Python
  • 回答数4
  • ありがとう数5

みんなの回答

  • bunjii
  • ベストアンサー率43% (3589/8248)
回答No.4

>このコードを実行すると、print(list) の結果として >['a', 'b', 'c'] >が得られることになります。 はい、それが正しい処理のようです。 >しかし私としては、['a', 'b', 'c', 'd']とならないのが不可解なのです。 あなたの解釈に誤りがあります。 X = list.pop() を実行したときXには何が代入されているかを確かめることをお薦めします。 list.pop() は変数の list の最後の要素である 'd' を切り分けて 'd' を変数 X へ渡しますので、 list には ['a', 'b', 'c'] しか残っていないはずです。 >(print(X) が ['a', 'b', 'c'] となれば納得するのですが、もちろんこの答えはdとなります。) list の値を元の ['a', 'b', 'c', 'd'] のままにするには次のようにすれば良いでしょう。 X = list Dust = X.pop() >pythonの文法上なぜこうなるのか教えて頂きたいです。 基本から復讐する必要があるようです。

回答No.3

>あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。 「左辺」じゃなくて「右辺」の間違いです。 失礼しました。

回答No.2

「代入だから元の値は変わらない」みたいな考え方はやめましょう。 「その命令がどんな作用をするのか」を考えるようにしないと、正しく理解できません。 例えば、同じソートでも sorted(list) ならlistは変更されないけど list.sort() はlistを変更する、といったことが理解しずらくなりますよ。 また、pythonではありませんが、C/C++のインクリメント演算子「++」は y = 100; X = y++; のようにすると、y=101になります。 あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。

回答No.1

listオブジェクトのpopメソッドの定義が「リスト中の指定された位置にある要素をリストから削除して、その要素を返します。」となっているからです。 変更したリストを返すのではなく、削除した要素を返すことになってます。 https://docs.python.jp/3/tutorial/datastructures.html >なぜなら、2行目の X = list .pop() は代数Xを定義しているにすぎず、リストであるlistには影響を与えていないと思うのです。 list.pop()を実行してその返り値をXに代入しています。list.pop()はlistに変更を加えるため、影響を受けないことはありません。

fisica
質問者

お礼

ありがとうございます。 私の違和感は list = ['a', 'b', 'c', 'd'] list .pop() print(list)  #→['a', 'b', 'c'] ならば納得できるのですが、 X = list .pop() print(list)  #→['a', 'b', 'c'] だと違和感を感じます。 例えば y=100 x=y-1 となっていても、次の展開で y=99 にはなりませんよね。

関連するQ&A

  • 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での配列の計算

    pythonで、配列Aの各要素(数字)に対して別途定義された関数で計算して別の配列Bに保存する、ということを考えています(あまりにも初歩)。 Pythonでこのコードを書くことができません。CやFortranでは1つ1つの配列要素をループで巡って計算して新しい配列に保存するだけなのですが、Pythonだと配列のサイズの指定はしなくていいはずですね。また配列要素1つ1つを見て回るようなこともしなくていいと思います(裏ではやっているのでしょうが)。これはどういうコードになるでしょうか。ネットなどで調べても簡単すぎるのか逆にたどり着けないみたいです。よろしくお願いします。 私が使っているPythonのテキスト(分厚い)には索引に”配列”もありません。リスト、タプルになってしまったのでしょうか。 また、このような初歩的処理はJuliaでもいけるのではと思います。Pythonの文法を手掛かりにJuliaもできそうなので。

  • 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で組合せ、順列

    pythonで、a=[4,5,6],b=[7,8],c=[9,10],x=a+b+cというリストがあり、 aの順列から1つ(a1)、bの順列から1つ(b1)、cの順列から1つ(c1)を選択し、 それらをxx=a1+b1+c1とするすべてのxxを求めるためにはどうすればいいですか? xxの例 [[6,4,5],[7,8],[10,9]]

  • 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 >の意味

    お世話になっております。pythonを勉強しておりまして、星座を求めるコードを見たのですが最後の行のコードが理解できませんでした。 print a[ m-13 + (d > b[m-1]) ] の>というのはどういう意味なのでしょうか。 よろしくお願いいたします。 # -*- coding: utf-8 -*- a = [u'山羊座', u'水瓶座', u'魚座', u'牡羊座', u'牡牛座', u'双子座', u'蟹座', u'獅子座', u'乙女座', u'天秤座', u'蠍座', u'射手座'] b = [20, 19, 20, 20, 20, 21, 23, 23, 23, 23, 22, 22] m = int(raw_input('月を入力してください: ')) d = int(raw_input('日を入力してください: ')) print a[ m-13 + (d > b[m-1]) ]

  • python ですが下記のプログラムがエラーになり

    python ですが下記のプログラムがエラーになります。どうしてでしょうか。よろしくお願い致します。 def revers(data): for index in range(len (data)-1,-1,-1): yield data[index] some_list = [‘a’, ‘b’, ‘c’, ‘d’] for e in revers(some_list): print(e) 実行結果をd      c      b      a にしたいのですがエラーがでます。

  • INDIRECTと名前の定義でリストを作成

    どなたか分かる方教えください。 A1のセルにコードを入力、B1のセルに商品 を入力したいと考えています。 但し、B1の商品はA1で指定したコードの商品郡を入力するようにしたいのです。 コードと商品郡は別シートに作成しています。 別シート)    A  B  C  D  E  1  2 A  B  C  D  E   3 ・  ・  ・   ・   ・  4 ・  ・  ・   ・   ・ 2行が全てコード、3行以降がA~Eの商品郡 になります。 3行目以降のセルには関数を入れて 別シート_2 より集計したものになります。 商品郡の数はコードによってバラバラです。 2行目の記入セルを「名前の定義」で「コード」としてあります。 各列を 「名前の定義」、「A」 {範囲:A3:A150}                「B」 {範囲:B3:B150}のようにしました。※今後増減するため、セルは多く設定しました 入力シートの A1にリスト範囲"=コード" B1に"=INDIRECT(A1)"  リストはでたのですが、空白セルが多いため使いづらく 空白セルを表示させないために 別シート!A1 に ="別シート!A3:A"&COUNTA(A3:A150) と入力し自分なりに可変するような式を作ったのですが、 入力シート B1に リスト範囲"=A"とすると 望むようなリストが出来たのですが、            リスト範囲"=INDIRECT(入力シート!A1)" とすると、 元の値はエラー・・・とエラー表示がでて、リストが表示されません。 どのようにしたらリストが表示されるようになりますでしょうか。 もしくは、増減するセル範囲を空白なしに表示させるにはどのようにしたらいいでしょうか。 質問の説明が不十分すぎて申し訳ないですが、分かる方教えていただけたら嬉しいです。

  • 線形代数……だとお思います。

    お世話になります。 himuro_tと申します。 線形代数でしょうか…教えてください。 問題 a1x+b1y+c1z+d1=0 a2x+b2y+c2z+d2=0 a3x+b3y+c3z+d3=0 以上の式で X,Y,Zの値を求めよ、という問題なのですが、手も足も出ません。 よろしくおねがいしますm(_ _)m

  • python

    pythonについての質問です。 def S_sa(k=1) for step in xrange(k) : if step == 0 : print 'a' else print 'b' というコードがあって、なぜかprint aが実行されるのはなぜでしょうか? xrangeのreturnは1ではないのでしょうか?

専門家に質問してみよう