- 締切済み
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の文法上なぜこうなるのか教えて頂きたいです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- bunjii
- ベストアンサー率43% (3589/8249)
>このコードを実行すると、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の文法上なぜこうなるのか教えて頂きたいです。 基本から復讐する必要があるようです。
- m-take0220
- ベストアンサー率61% (480/785)
>あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。 「左辺」じゃなくて「右辺」の間違いです。 失礼しました。
- m-take0220
- ベストアンサー率61% (480/785)
「代入だから元の値は変わらない」みたいな考え方はやめましょう。 「その命令がどんな作用をするのか」を考えるようにしないと、正しく理解できません。 例えば、同じソートでも sorted(list) ならlistは変更されないけど list.sort() はlistを変更する、といったことが理解しずらくなりますよ。 また、pythonではありませんが、C/C++のインクリメント演算子「++」は y = 100; X = y++; のようにすると、y=101になります。 あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。
- m-take0220
- ベストアンサー率61% (480/785)
listオブジェクトのpopメソッドの定義が「リスト中の指定された位置にある要素をリストから削除して、その要素を返します。」となっているからです。 変更したリストを返すのではなく、削除した要素を返すことになってます。 https://docs.python.jp/3/tutorial/datastructures.html >なぜなら、2行目の X = list .pop() は代数Xを定義しているにすぎず、リストであるlistには影響を与えていないと思うのです。 list.pop()を実行してその返り値をXに代入しています。list.pop()はlistに変更を加えるため、影響を受けないことはありません。
お礼
ありがとうございます。 私の違和感は 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 にはなりませんよね。