Pythonのお勉強 Part75 (964レス)
1-

656
(1): (ワッチョイ f66d-1ngM) 08/10(日)11:16 ID:wmWYPlFf0(2/9) AAS
>>655
y = x という代入構文において、①右辺のx という名前参照式の評価(名前xが束縛されているメモリ領域に格納されているポインタのポイント先のオブジェクトを得ること)、②それを名前yに代入すること(C言語レベルでは652に書いたとおり、名前yが束縛されるメモリ領域に上記①で得られたオブジェクトのアドレス情報を格納するという形で処理される)という処理が行われるわけだけど、このプロセスに状況(コンテキスト)による違いなんてあるかな? 状況(コンテキスト)如何に拘らず、上記①②の処理がなされると思っていたんだけど。

まぁ、内部実装についてある程度知識がないと分かりづらいというのはそうだと思う。自分も非常に大雑把な知識しかないしね。
657
(1): (ベーイモ MM06-ZDX3) 08/10(日)12:21 ID:rZf5P+kFM(1) AAS
Pythonの場合は、numpyの配列のようにPythonオブジェクトの実体すらもPythonの世界の外に存在する物に対する荷札的な役割を果たしているケースがとても多く、
しかも初心者は学習を始めてすぐにそういうイレギュラーなものに触れることになる
なので内部実装を元に説明するのは辛すぎるんだろう
荷札のアナロジーは致命的な矛盾なくだいたいうまく説明できるし実際の動作とそんなにかけ離れてもいない、悪くない説明だと思うよ
658
(1): (ワッチョイ 7a0a-WVpU) 08/10(日)12:27 ID:swuUdv2c0(1/11) AAS
>>655
代入という言葉は、数学の変数に値を入れるという意味に引きずられるのでよくないんだよ
659
(1): (ワッチョイ 0754-mJPu) 08/10(日)12:35 ID:rGiN2SBN0(4/10) AAS
荷札って箱に付けるものでしょ
そうじゃなくて、実体とは別に存在するコピー可能な何かでないと
そんな都合の良いものは自然界に存在しないので、いいアナロジーも見つからない
660: (アウアウウー Sac7-Kgix) 08/10(日)12:43 ID:YgXeJoCWa(1) AAS
数学からの借用だと思うと
x = x + 1

x[n] = x[n-1] + 1
を意味する
661
(1): (ワッチョイ 7601-AJBo) 08/10(日)12:49 ID:Rqt3voUn0(3/4) AAS
>>656
(Pythonの)(y = x という)(代入構文における)(右辺の)x
のxを修飾する部分がコンテキスト

それにその説明だと>>646の言うシンプルな理解からは程遠い気がする
662
(1): (ワッチョイ 7601-AJBo) 08/10(日)12:56 ID:Rqt3voUn0(4/4) AAS
>>658
数学の変数に値を入れるという意味に引きずられると何でよくないの?
663: (ワッチョイ 0754-mJPu) 08/10(日)13:01 ID:rGiN2SBN0(5/10) AAS
x = x + 1
の処理毎に加算されていく、というカウンタ動作は、
数列の漸化式というよりは、z^(-1)みたいな離散時間で捉えると動作とよく合う
664
(1): (ワッチョイ 7a0a-WVpU) 08/10(日)13:03 ID:swuUdv2c0(2/11) AAS
>>662
数学だと正確にはその例でも左辺と右辺はイコールという意味だ
665: (ワッチョイ 0754-mJPu) 08/10(日)13:08 ID:rGiN2SBN0(6/10) AAS
代入(assign)は割り当てと同じ意味で、何かを別のもので置き換える
y = x + 1
なら何も困らない
x = x + 1
は割り当てではなくて関係式(equation)になって、xは未知数
そして解けない
666
(2): (ワッチョイ f6ce-1ngM) 08/10(日)13:22 ID:wmWYPlFf0(3/9) AAS
>>657
コレクション・コンテナを理解するためには、ラベル(名札)のアナロジーによらない方が正確に理解できるし、コレクション・コンテナの重要性を考えるとそれは致命的な弱点だと思うけどね。たとえば、tupleのimmutabilityに関してtupleオブジェクトの要素であるlistの要素に変更があってもそれはtupleのimmutabilityには反しないということを学ぶけど、それは内部実装のイメージがないとわかりにくいと思うよ。
初めのうちから内部実装をベースに理解しようとするのはたしかにムリがあるけれども、ラベル(名札)のアナロジーによる説明は所詮小手先の誤魔化しに過ぎないので、どこかの段階で内部実装に基づく(といっても大したレベルではなく、C言語のポインタの概念の基本を知っていれば足りるレベル)理解に切り替えた方が良いと思うけどね。

>>661
自分は、代入構文の説明としては、結局は箱のイメージで説明するのが(主にラベル(名札)のアナロジーによる説明との比較で)ベターではないかと考えているので、その点では646にも近い立場だけど、それがシンプルに理解できるとは微塵も考えていない。箱に格納されるのはアドレス情報であってそれ自体としてはPytnonのオブジェクトではないし、C言語レベルの内部実装に関する知識に依拠した説明になるからね。647に書いたとおり、本来的には(C言語レベルでは)比較的シンプルなはずのアイデアが、Pytnonでは(仕方のないことではあるけれども)屈折した表れ方になるなぁと思っている。
なお、「コンテキスト(状況)」という語をどういう趣旨で使いたかったのかというのは分かったけど、652に対する批判の文脈でどういう意味合いを持たせたかったのかはよく分からないな。
667: (ワッチョイ 1af4-ZDX3) 08/10(日)13:25 ID:WyYSCohm0(1/2) AAS
>>659
わかってないな、コピーしなくていいんだよ
x = A() # Aの実体をどこかに作成し、荷札xを貼り付ける
y = x # xが貼り付けられている実体に追加で荷札yを貼り付ける
辻褄は合うだろう?
668: (ワッチョイ 0754-mJPu) 08/10(日)13:45 ID:rGiN2SBN0(7/10) AAS
荷札という名称が悪すぎるわw

実体の所有者(複数可)が誰か判るような管理リスト、みたいなイメージ
実際にはリストじゃないからこの時点で乖離があるけど
登記簿とか株券の裏を複数所有可能にした的な
所有してる訳でもないのでズレる

なんで「参照」の一言を参照使わずに説明するのがこんなに困難なのか
669: (ワッチョイ 1af2-ZDX3) 08/10(日)14:04 ID:WyYSCohm0(2/2) AAS
>>666
t = (x, y)
u = t
これは、荷札xの付いた実体に対して荷札t[0]を、荷札yの実体に対して同様に荷札t[1]を貼り付ける、
同時に、荷札t[0]とt[1]を管理するために”t[0], t[1]”と書かれた台帳を作成し、その台帳に荷札uを付けると解釈すればよい
これは参照の向きを逆に捉えて参照される側が参照元を記憶していると考えているだけなので、基本的にはこのような説明で矛盾は生じない
荷札名から実体を探すのが大変だという問題は残るけどね
670: (ワッチョイ f6ce-1ngM) 08/10(日)14:29 ID:wmWYPlFf0(4/9) AAS
仮にそれをそのまま実装に反映させるなら、Pytnonオブジェクトに(被参照カウント数に加えて)参照元のリストも持たせるってことでしょ。
そうではなく、単に解釈モデルに過ぎないってことなら、内部実装がそうなっているわけでもないのに、あえてそんな不自然な解釈モデルを作ってまで荷札(ラベル・名札)のアナロジーに拘る意味ってあるのかな? たとえばそれで、(666でちょっと触れた)tupleの要素であるlistの要素を変更してもtupleのimmutabilityに反しないことの説明がしやすくなったりする?
671
(1): (ワッチョイ 7601-AJBo) 08/10(日)15:10 ID:BWOE9N0b0(1/3) AAS
>>664 665
y = x + 1なら「yにx + 1を割り当てる」「yをx + 1で置き換える」
x = x + 1なら「xにx + 1を割り当てる」「xをx + 1で置き換える」
で特に困らないと思うんだけど

数学の場合は変数が指し示す値が同じスコープ内で変化しない大前提があるからそれを元に「代入」を考えると「xにx+1を代入する」がおかしいという感覚になるのでは?

それともイコールじゃなくて「x ← x + 1」なら←は代入ですと言ってもしっくりくるのかな?
672
(1): (ワッチョイ 7a0a-WVpU) 08/10(日)15:49 ID:swuUdv2c0(3/11) AAS
>>671
だから:=にしているプログラミング言語もある

私は「代入」という言葉を否定している人間だ。
「代入」は数学の記法の見た目と同じだから出てきた言い回しにすぎない。

仕事では「設定」などと呼ぶ。英語でもsetと呼んでいる。
673
(1): (ワッチョイ 7601-AJBo) 08/10(日)15:53 ID:BWOE9N0b0(2/3) AAS
>>666
>652に対する批判の文脈でどういう意味合いを持たせたかったのかはよく分からないな

>>648に書いてるのと同じなんだけど箱を箱のまま入れ物として取り扱う状況と箱を箱の中身が示す値として取り扱う状況の説明なくそれらを無意識に使い分けながら「一貫した説明ができる」と言ってるのを自覚して欲しかったとでも言えばいいだろうか
674: (ワッチョイ 0754-mJPu) 08/10(日)15:57 ID:rGiN2SBN0(8/10) AAS
代入という訳語の気が利きすぎてるんだよな
assignのニュアンスそのままなら代入は出てこない
単に関連付けをしてるだけ
代わりに入れるという何か動きを持った訳語にしたせいで、逆に理解を阻害する
675
(1): (ベーイモ MM06-ZDX3) 08/10(日)16:00 ID:VcYsNhlgM(1) AAS
>>672
setには、ある既存の構造を正しく整った状態へと変えるというニュアンスがある
単なる変数の代入は変数の中身をまるっと置き換えているだけで既存の構造を変化させているわけではないし、
新しい値もそれが正しく整ったものとは限らず、ごく一時的なものだったりする
なのでより直接的なassignが用いられる
676: (ワッチョイ 7a0a-WVpU) 08/10(日)16:14 ID:swuUdv2c0(4/11) AAS
>>675
Pythonの話なら私は知らない。
677
(1): (ワッチョイ f64c-1ngM) 08/10(日)16:46 ID:wmWYPlFf0(5/9) AAS
Pytnonの言語仕様として「代入文」という名称で規定されているんだから、ひとまずこのスレで「代入」と呼ぶことには何の問題もないと思うけどね。それが数学における代入概念とは意味が違うから別の呼び方をすべきだというのは1つの意見としては傾聴に値すると思うけど、それはまた別の話でしょ。

>>673
それは661でコンテキスト(状況)として挙げられた要素に対応する違いであるか甚だ疑問だし、そもそも「箱を箱の中身が示す値として取り扱う」というようなふわっとした理解だから混乱するのでは。
大前提として、①名前と②名前が束縛されるメモリ領域(=箱)とは区別される概念だけどこれはいい? それから、②名前が束縛されるメモリ領域(=箱)と③そこに格納されている実体(オブジェクト・値)も区別される概念だけどこっちはいいよね。たぶん、①②の区別が曖昧だから「箱を箱の中身が示す値として取り扱う」というような表現が出てくるんだと思うけど。
注意すべきは「変数」という用語の多義性で、この語は上記①〜③のいずれを指すか曖昧なまま使われがち。かつそういう曖昧な認識のまま「変数=箱」という説明がされがちなので混乱が起きるんだと思うけどね。なお、そういう観点からいうと、646の「箱=値」という表記の仕方も(直感的にはわかりやすいけれども)こういう曖昧な理解を助長する弊害はあるんだろう。
上記のような概念的な区別がきちんとできている限り、コンテキスト(状況)如何で変わるような話ではないということは理解しやすいと思うけどどうかな(あるいは、必要なのは概念的な区別であって、コンテキスト(状況)の場合分けではないという言い方をしても良い)。
678: (ワッチョイ 7a0a-WVpU) 08/10(日)17:03 ID:swuUdv2c0(5/11) AAS
箱は伝統的なプログラミング入門書が使うわかりにくい例えだしな

それより丸数字の使用が気になるぞ
679: (ワッチョイ 7a0a-WVpU) 08/10(日)17:11 ID:swuUdv2c0(6/11) AAS
ドキュメンテーションのない仕事をしているのがはっきりとわかるよなあ
680: (ワッチョイ f64c-1ngM) 08/10(日)17:15 ID:wmWYPlFf0(6/9) AAS
メモリ領域を箱に例えるのはコンピューターのアーキテクチャーに忠実な良い例えだと思うけどね。Pytnonみたいな言語ではC言語レベルに還元しないと正確な理解に到達できないという憾みはあるが、それでもラベル(名札・荷札)のアナロジーのような曖昧なイメージに頼るよりよほど良いと思うよ。

ところで、丸数字って今でも読みづらく化けたりする? 5chみたいなところで使う分には、もう、そんなに気にしなくても良い時代かなと思っていたんだが。
681: (ワッチョイ 0754-mJPu) 08/10(日)17:20 ID:rGiN2SBN0(9/10) AAS
一番気になるのは改行しないことだな
682
(2): (ワッチョイ 7601-AJBo) 08/10(日)18:04 ID:BWOE9N0b0(3/3) AAS
>>677
>>652から引用すると「y = x は(C言語レベルでは)名前(変数)yが束縛されているメモリ領域(646風にいえばyという箱)にオブジェクト"foo"のアドレス情報を入れるという形で処理されることになる。」

ここでは何の説明もなくxが「オブジェクトfoo"のアドレス情報」に変換されてるよね?

同じxでも直前の`x=“foo”`のxは箱のまま入れ物として取り扱われていたが
`y = x`のxは箱の中身が指し示す値として取り扱われている
その違いを生むのがxが評価されるコンテキストの違い
683: (ワッチョイ 7a0a-WVpU) 08/10(日)18:34 ID:swuUdv2c0(7/11) AAS
アセンブラのニーモニックが辞書を片手に見るか、覚えていないといけないのをわかりやすく表現しただけのものをマシン語の並び順すら知らずにこねくり回した説明をしているのは滑稽
684: (ワッチョイ 7a0a-WVpU) 08/10(日)18:45 ID:swuUdv2c0(8/11) AAS
>>682
CPUのレジスタがメモリのような連続した長いものでないため、コンピューターではレジスタで収まるものとそうでないものの区別がある。

コンピューターそのものがCPUとメモリという別のものを組み合わせているから、メモリへの参照なのかどうかは曖昧にしたまま進化しただけ。
685
(2): (ワッチョイ f64c-1ngM) 08/10(日)19:11 ID:wmWYPlFf0(7/9) AAS
>>682
何の説明もなくって、代入文の右辺の式が評価されるのは代入文の言語仕様そのままでしょ。何か不明確な点ってある?
代入文の左辺か右辺かの違いもコンテキスト(状況)の違いであって、そのいずれであるかによって言語処理系による名前(変数)の扱いが異なるという趣旨のことを主張したいのなら別に積極的に異論をとなえるつもりもないけれども、それについて、Pytnonの言語リファレンス等で明らかになっていることに付け加えて何か説明しなきゃいけないことってあるかな?
「箱自体を値として使う場合」(648)とか「箱を箱の中身が示す値として使う状況」(673)というのは概念上の区別が不十分であることに基づく不正確な表現・理解だと思うけど、その点が正された後になお何か理解できない点があるの?
1-
あと 279 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.028s