こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2018-01-04 01:34:37

QNo.9414698

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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の文法上なぜこうなるのか教えて頂きたいです。
基本から復讐する必要があるようです。

投稿日時 - 2018-01-05 13:22:45

ANo.3

>あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。

「左辺」じゃなくて「右辺」の間違いです。
失礼しました。

投稿日時 - 2018-01-05 05:12:26

ANo.2

「代入だから元の値は変わらない」みたいな考え方はやめましょう。
「その命令がどんな作用をするのか」を考えるようにしないと、正しく理解できません。
例えば、同じソートでも

sorted(list)

ならlistは変更されないけど

list.sort()

はlistを変更する、といったことが理解しずらくなりますよ。

また、pythonではありませんが、C/C++のインクリメント演算子「++」は

y = 100;
X = y++;

のようにすると、y=101になります。
あくまで、代入式の左辺にある演算等が先に実行され、その結果やメソッドの返り値などが代入さると理解しましょう。

投稿日時 - 2018-01-05 04:47:19

ANo.1

listオブジェクトのpopメソッドの定義が「リスト中の指定された位置にある要素をリストから削除して、その要素を返します。」となっているからです。
変更したリストを返すのではなく、削除した要素を返すことになってます。

https://docs.python.jp/3/tutorial/datastructures.html

>なぜなら、2行目の X = list .pop() は代数Xを定義しているにすぎず、リストであるlistには影響を与えていないと思うのです。

list.pop()を実行してその返り値をXに代入しています。list.pop()はlistに変更を加えるため、影響を受けないことはありません。

投稿日時 - 2018-01-04 09:37:00

お礼

ありがとうございます。
私の違和感は
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
にはなりませんよね。

投稿日時 - 2018-01-04 13:58:48

あなたにオススメの質問