プログラミング出来る人ちょっときて

記事サムネイル
1 : 2025/02/06(木) 23:31:08.068 ID:sWBnO0gPa
x, y = y, x = 0, 1
print(x, y)

するとxに1、yに0が入ってるのなんで?
Pythonなんだけど

3 : 2025/02/06(木) 23:33:47.143 ID:nu2JoySA0
上書きしてるからだろ
4 : 2025/02/06(木) 23:36:02.724 ID:2Dl8lPxy0
仕様考えりゃ分かるだろ
まずy,x=0,1が評価
次にx,y=y,xが評価
6 : 2025/02/06(木) 23:38:27.250 ID:sWBnO0gPa
>>4
最初でyに0でxに1が入るじゃん?
次でxyがスワップされるからxに0でyに1にならないの?
5 : 2025/02/06(木) 23:36:54.886 ID:sWBnO0gPa
x, y = y, x = 0, 1

ってさ、右から評価するわけじゃん?
するとさ、

y, x = 0, 1
x, y = y, x

っていう処理がされてるのと同じはずじゃん?
後者だとxは0でyは1になるじゃん?
じゃあなんで前者は逆なのよ?

7 : 2025/02/06(木) 23:39:09.115 ID:OIHKpe7g0
パッと見たらx = 1とy = 0で合ってるような気がするよな
8 : 2025/02/06(木) 23:39:27.731 ID:sLXfI0RR0
2行に分けて処理さしたらどうなんの?
11 : 2025/02/06(木) 23:43:43.881 ID:sWBnO0gPa
>>8
それが2行に分けたらxが0、yが1になんのよ

y, x = 0, 1
x, y = y, x
print(x, y)

はxが0, yが1なのよ

9 : 2025/02/06(木) 23:40:07.170 ID:sWBnO0gPa
マジで納得できない…
Geminiに問いただしたら答えを訂正しやがったんだけど、コードを実行するとやっぱり違ってる
誰か教えてくれぇ
10 : 2025/02/06(木) 23:43:17.847 ID:SpcyWb8h0
ただの未定義動作
12 : 2025/02/06(木) 23:44:57.706 ID:sWBnO0gPa
>>10
これなら喜んで納得して寝るわ
13 : 2025/02/06(木) 23:45:53.680 ID:b8QPV5lW0
pythonに未定義動作なんてあんの?
14 : 2025/02/06(木) 23:46:23.407 ID:Gy2QJ8770
>>13
ないよ
15 : 2025/02/06(木) 23:47:48.354 ID:sWBnO0gPa
>>14
そうだよねえええええ
じゃあ何故なんだ
17 : 2025/02/06(木) 23:48:50.915 ID:2Dl8lPxy0
並行代入機能で調べてみ
右の1がその左辺のxに入って、そのまま一番左辺のxにまで入ってるだけ
19 : 2025/02/06(木) 23:52:19.827 ID:AfnHwUoY0
ザクっと言うと
変数とかの位置関係ではなく

右から評価します
あ。エックスは1なんだ!
じゃあ次もエックスは1だね!

21 : 2025/02/06(木) 23:58:36.988 ID:sWBnO0gPa
>>17
ごめんググってもそれらしいページ見つからない…

>>18
つまり
a = b = c
みたいなものがあった時
a=c
b=c
って入ってくってことか?
「左から右に」の解釈に自信がない

>>19
「じゃあ次もエックスは1だね!」←これが分からない…

20 : 2025/02/06(木) 23:57:48.718 ID:kwioG4sT0
最初のイコールの評価はタプルを逆にしてるってことだよね
2回目はタプルに値を入れてる
22 : 2025/02/07(金) 00:03:04.450 ID:XoW4tb+Ba
x, y = y, x = 0, 1
print(x, y)

y, x = 0, 1→ここではy = 1であることx = 1であることが一時的に記憶される
x, y = y, x→ここではその記憶された情報を引っ張ってくる。この引っ張ってくる時に位置は関係ない。例えば10個変数が並んで順番が全て滅茶苦茶だろうが、その前に記憶されたx = 1を持ってくる
どこにxがあろうがxは1である。

24 : 2025/02/07(金) 00:05:27.911 ID:JEV6naiV0
>>22
それだと>>11の動作が説明できなくね?
28 : 2025/02/07(金) 00:07:33.719 ID:sFY9lKPL0
>>24
式と文の違いじゃないの?
あんま詳しくないけど
23 : 2025/02/07(金) 00:03:45.199 ID:XoW4tb+Ba
y, x = 0, 1→ここではy = 0であることx = 1であることが一時的に記憶される
だな
29 : 2025/02/07(金) 00:11:27.357 ID:Yc5LhosF0
そんなクソみたいな文を書かないで良いんじゃない
31 : 2025/02/07(金) 00:12:11.718 ID:JEV6naiV0
マジで誰も分かんないの?
32 : 2025/02/07(金) 00:12:59.933 ID:vq1ciO/50
タプル逆にしてる操作だって言ってるだろ
文法調べろ
34 : 2025/02/07(金) 00:14:13.773 ID:gpjsvmuua
Pythonでは変数の入れ替えがタプル(カンマで区切る)というものによって可能となっている
35 : 2025/02/07(金) 00:16:30.929 ID:43U1pduRM
原理も糞も難しく考えすぎじゃね
最初にx=1だと記憶れされたんだからどの位置にあろうがx=1ってだけでしょ
36 : 2025/02/07(金) 00:18:05.020 ID:4M6dgg5Na
>>35
x, y = y, x は一切評価されないってこと?
37 : 2025/02/07(金) 00:19:44.823 ID:dT5/jgufa
>>36
評価はしてるよ
それがあるから記憶されてるx=1って情報を持ってきてる
38 : 2025/02/07(金) 00:21:56.746 ID:4M6dgg5Na
>>37
評価してるなら
x, y = y, x は、y, x = 0, 1によってyは0,xは1が記録されてるわけだから、

x, y = 0, 1 って処理されるんでないの?

39 : 2025/02/07(金) 00:24:32.508 ID:v9IACksBa
いやいや…上でもずっと言われてるけど
xは1が記録されてる訳だからxは1
これはこういうものだしこういう仕組み
その仕組みがおかしいというならもう開発者にクレームでも入れるしかない
そういう仕組み
40 : 2025/02/07(金) 00:27:20.728 ID:sFY9lKPL0
調べたらマルチターゲット代入の場合は、一番右辺の値がそれより左の変数に直接代入されるらしい
だから真ん中がスッポ抜けてこうなると

URL貼れなかったけど
Pythonのマルチターゲット代入の評価順序
って記事読んだ

42 : 2025/02/07(金) 00:29:26.594 ID:5eXxMzSha
listとか使ってると思った方が良いんじゃね
listの中にx=1,y=0であるという情報を格納したんだ
そしてそのlistからxとyの情報を持ってきた
実際にはlistじゃなくタプルによって似たような動作になってるだけ

コメント

PAGE TOP
タイトルとURLをコピーしました