アカウント名:
パスワード:
という、中学生が理解しやすいしきい値で説明した教科書につっこんでいる大人みたいだな。
変数は箱じゃないっていう主張はいいけど、箱じゃないならなんて言って説明すんのさ
ちゃんと説明するなら、変数は箱で、変数への名前の束縛が彼の言うところのラベル貼りになるんだろうね。そうでもしないと、Cやschemeで普通に現れる「名前無しの変数」が説明できなくなる。言語ごとに、変数のエクステントやスコープの規則が異なるから、pythonしか触ったことのない人には難しいんじゃないかな。pythonのスコープは、ダイナミックスコープを彷彿とさせるから、彼も、そのうちfunarg問題とかに気づくことでしょう。
そもそも数学の関数の語源が函数なんだから、関数こそが函であり箱。変数を箱だと感じている人は変数のことをf(x){return x;}(数学だとf(x) = x)みたいなプリミティヴな関数だと捉えているからで、変数そのものに箱の機能があるわけではない。
という話はおいといて、変数宣言でスタックに領域を確保する言語を考えると、変数を箱と言いたくなる気持ちはわかるが、それでは変数の一面しか表せない。実際にプログラミングでどう変数を使うかってことを考えると、変数はロジックを記述するために繰り返し使うわけで、それは「箱だから」で説明できたり理解が容易になったりしない。比喩として成立してないんだよ。
あれこれ否定するのは簡単。じゃなんて呼べば端的に説明しやすくなるの?
変数は変数でいいでしょ。なんでわざわざ箱とかラベルとか、わかりにくい例えを使う必要があるのか。
だから名札なんでしょ。数学の変数でもそうだけど、個別に代入された値に意味があるわけじゃなくて、それを抽象化して再利用するために変数を用いているんだから。実身・化身の化身の方が変数の本質で存在理由。
手軽なゆえJSなのでしょう。学者にでもなりたいのなら厳密がいいと思うけど、大半の学生は飽きて興味が無くなるのがオチ。
ソースで「名札」という例を挙げているにもかかわらず読まずに上から目線でコメントするのがスラドしぐさ
名札(ラベル)は数字にくっつく感じがするからちょっと…
名札に代入って言われても意味わからんよそれなら数学の変数に関連付けたほうがわかりやすい
ソースに「変数は名札、代入は名札を貼ること」と書いてあるのに「名札に代入」とか誰も言ってない例えを持ち出して意地でもソース無視してケチ付けようとするのは何なの? アホなの?
「変数は名札」という例が>a = [1, 2, 3] # [1, 2, 3] というデータに、「a」という名札を貼る。とある。じゃあデータはどこに存在するの?変数は名札とは?データに名札を貼るんだよね?・・・箱の方がよくね?またはもうオブジェクトとして覚えた方がまだよくね?
データはメモリ上のどこかに存在する
最適化の状況次第では、メモリに置かずにレジスタ上の処理で完結する場合もあるのでは?
もう学生はついていけないだろうな
それがどうかした?
結局実装は様々なわけで、無理に概念と実装を対応させることなしに、概念だけ切り出して教えても良いよねって流れだったのでは?
「高校 情報Ⅰ Python」って名前の教科書なんだから実装依存でよくね
え、そういう流れだったのか。オブジェクトとして覚えることとデータの存在場所がどう繋がるのか分からんかった。
pythonってCPythonに限るの?
床や机の上でもいいし、箱に入っていてもいい。箱に入っていてもいいけど、1つの箱を異なる変数で参照することができるから、箱そのものを変数としてしまうと、解釈が困難になってしまう。
ああ、こっちもあほな説明だって指摘してほしかったんか「変数」の意味から調べなおせ
数学を引き合いに出すと混乱の元だから止めとけ。n=n+1なんて、数学的にはナンセンスだから。
まあ、静的単一代入(SSA)で書けば混乱することはないけど、再代入を知らないだけだと思われそう。
目くそ鼻くそ程度の違いしか感じられないな。この教科書で学んでる子がその違いを意識する必要があるのかな?しょせんメタファーとしての限界はあるのだから、イメージしやすく理解しやすい方を優先した方がいいこともあるよ。
「変数は箱」というのは早い段階で理解に困ることになる不適切な喩え話です。
と、この教科書で学んでる子がその違いを意識する必要性について書いてあるよね。
実際誰がどれくらい困ったことになったのかねコレで?
それを定量的に表すのは困難だけれど、元記事の示すコード例を読めば、理解に困るであろうことは容易に想像できるね
こんな言語だと困る!って話を出すならラベルでも困るんよね
箱に入れるというメタファーが変数の代入という概念と合いやすいから使われるんじゃね数学の変数と類推しやすいし
どーしてもポインタを理解できない人が何割もいるんだぜまずは基本だけ教えて参照とかポインタの話はまだまだ先なんかも
数学だってレベル別が普通なんだし情報なんかレベル違いすぎるやろうな…どんな盆でも机上ではなぁ
イメージしやすく理解しやすい方を優先した方がいいというのなら、それこそ名札と呼べばいいよね
箱がないとすると、100GiBのデータをPythonの変数で扱えないことの説明ができない。逆に箱があっても箱に名札をつければ同じことが説明できる。
例として挙げられているPythonやJavaScriptなどの場合、変数が指し示すものは(数値など一部のプリミティブなデータ型を除き)オブジェクトの参照だよね。だから変数への代入は名札でのメタファーのほうが適切に説明できるということだろう。オブジェクトそのもの(名札を付ける対象)は箱のメタファーで説明するとしても。
詳しくないから教えて欲しいんだけど、Pythonの変数で100GiBのデータって扱えないの?メモリが許す限り制限はないと思ってた。逆に何GiBまでなら扱えるの?
x = b" " * 100*2**30
ChatGPT曰く
このpythonのコードは、バイト文字列(b" ")を100個作成し、それらを2の30乗倍(1,073,741,824)することで、空のバイト文字列を1,073,741,824個作成します。変数xにそのバイト文字列を格納します。これは、大量のデータを扱う場合に使用することができますが、注意して使用する必要があります。これは、大量のメモリを使用するため、メモリ不足によってプログラムがクラッシュする可能性があります。
このpythonのコードは、バイト文字列(b" ")を100個作成し、それらを2の30乗倍(1,073,741,824)することで、空のバイト文字列を1,073,741,824個作成します。変数xにそのバイト文字列を格納します。
これは、大量のデータを扱う場合に使用することができますが、注意して使用する必要があります。これは、大量のメモリを使用するため、メモリ不足によってプログラムがクラッシュする可能性があります。
メモリ100GiBプラスアルファあればPythonの変数で扱えますよってことでいいのかな?
ポインタの概念をもうちょっと平易な例えとして名札を出して来るのは上手いけど、ちょっと束縛感が弱いかな。「xくーん、あれ? どこいったー」みたいな行方不明が起こりそうな気がして落ち着かない。初学者って自分が分からないことをどう自由な面白い(間違った)解釈で片づけちゃったりするので、変数というのはなんか大変なものだという変な印象を持ちかねないのはちょっと怖いかな。
だいたい、JavaScriptのデバッガでも変数表とにらめっこすることになる。ので結局、教える順序が、
a. 最初から変数の真の姿を教えよう→まあ、常にそこまで考えるのは面倒くさいので意識せずこうい
>「xくーん、あれ? どこいったー」みたいな行方不明が起こりそうな気がして落ち着かない。
メモリーリークってそういうことなんでは。
C言語とかならなんも考えずにやってるとしょっちゅう起こるし、ガベージコレクションがある言語でも状況によっては起こるな。さあさあ楽しい明示的なメモリ解放処理の実装のお時間だ。
よく調べずに原子に原子って名前をつけた人たちはきっとあの世で…
「箱」って説明でうまくいく言語って何があるんだろう?C?それでも名札で説明するほうがしっくりくるように思える。
領域確保が必要な場合は箱がわかりやすいあと元記事にも下記の記載がある
※ 追記:読み落とされている方が居るようなので補足しますが、最初に「(変数は箱だという喩えは)プログラミング言語によっては適切」と書いたとおり言語によって適した喩えは違うので、「変数は箱」という喩えが常に悪いという主張ではありません。Python 等の言語を使っている以上は「変数は箱」より「変数は名札」という喩えのほうが適切でしょう、という主張です。
だからそのプログラミング言語はなんだろう?という話なんだけどね。個人的には領域確保こそ名札のほうが分かりやすいと思った。確保された領域はポインタの指し示す先であって、「箱」には領域を指し示す「ポインタ」が入っているので。と思うと名札と教えられたほうがいいんじゃないかなと。
は、アセンブラか!?
陽子と中性子ならわかるが電子は分解できなくね
今はな
xという箱に1が入っていてyという箱に2が入っているとして、それらをzに入れたらzが3になってxとyは空にならないと箱というメタファーはおかしい。
箱や名札よりは、(ひとつのことしか書けない、けど上書きが出来たりする)メモ用紙というメタファーが良いと思うな。そのメモ用紙に名札が貼られている。
zにコピーしたんだよ
「箱」ってさ、変数じゃなくてメモリ全体に対する例えに使うべき表現だと思うんだよね
そうですか。ちなみに変数の実体はレジスタかメモリの一領域であることはご存じの通り。レジスタは、特定の変数だけが独占するものではない。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生unstable -- あるハッカー
陽子、電子はこれ以上分解できない粒子 (スコア:2, すばらしい洞察)
という、中学生が理解しやすいしきい値で説明した教科書につっこんでいる大人みたいだな。
変数は箱じゃないっていう主張はいいけど、箱じゃないならなんて言って説明すんのさ
Re: (スコア:0)
ちゃんと説明するなら、変数は箱で、変数への名前の束縛が彼の言うところのラベル貼りになるんだろうね。
そうでもしないと、Cやschemeで普通に現れる「名前無しの変数」が説明できなくなる。
言語ごとに、変数のエクステントやスコープの規則が異なるから、pythonしか触ったことのない人には難しいんじゃないかな。
pythonのスコープは、ダイナミックスコープを彷彿とさせるから、彼も、そのうちfunarg問題とかに気づくことでしょう。
Re: (スコア:0)
そもそも数学の関数の語源が函数なんだから、関数こそが函であり箱。変数を箱だと感じている人は変数のことをf(x){return x;}(数学だとf(x) = x)みたいなプリミティヴな関数だと捉えているからで、変数そのものに箱の機能があるわけではない。
という話はおいといて、変数宣言でスタックに領域を確保する言語を考えると、変数を箱と言いたくなる気持ちはわかるが、それでは変数の一面しか表せない。実際にプログラミングでどう変数を使うかってことを考えると、変数はロジックを記述するために繰り返し使うわけで、それは「箱だから」で説明できたり理解が容易になったりしない。比喩として成立してないんだよ。
Re: (スコア:0)
あれこれ否定するのは簡単。
じゃなんて呼べば端的に説明しやすくなるの?
Re:陽子、電子はこれ以上分解できない粒子 (スコア:1)
変数は変数でいいでしょ。
なんでわざわざ箱とかラベルとか、わかりにくい例えを使う必要があるのか。
Re: (スコア:0)
だから名札なんでしょ。数学の変数でもそうだけど、個別に代入された値に意味があるわけじゃなくて、それを抽象化して再利用するために変数を用いているんだから。実身・化身の化身の方が変数の本質で存在理由。
Re: (スコア:0)
JavaScriptなんてlispの次に難易度の高い言語は中学生の教科書にはふさわしくないと思う。
Re: (スコア:0)
手軽なゆえJSなのでしょう。
学者にでもなりたいのなら厳密がいいと思うけど、
大半の学生は飽きて興味が無くなるのがオチ。
Re: (スコア:0)
ソースで「名札」という例を挙げているにもかかわらず読まずに上から目線でコメントするのがスラドしぐさ
Re: (スコア:0)
名札(ラベル)は数字にくっつく感じがするからちょっと…
Re: (スコア:0)
名札に代入って言われても意味わからんよ
それなら数学の変数に関連付けたほうがわかりやすい
Re: (スコア:0)
ソースに「変数は名札、代入は名札を貼ること」と書いてあるのに「名札に代入」とか誰も言ってない例えを持ち出して意地でもソース無視してケチ付けようとするのは何なの? アホなの?
Re: (スコア:0)
「変数は名札」という例が
>a = [1, 2, 3] # [1, 2, 3] というデータに、「a」という名札を貼る。
とある。
じゃあデータはどこに存在するの?変数は名札とは?データに名札を貼るんだよね?
・・・箱の方がよくね?
またはもうオブジェクトとして覚えた方がまだよくね?
Re: (スコア:0)
データはメモリ上のどこかに存在する
Re: (スコア:0)
最適化の状況次第では、メモリに置かずにレジスタ上の処理で完結する場合もあるのでは?
Re: (スコア:0)
もう学生はついていけないだろうな
Re: (スコア:0)
それがどうかした?
Re: (スコア:0)
結局実装は様々なわけで、無理に概念と実装を対応させることなしに、概念だけ切り出して教えても良いよねって流れだったのでは?
Re: (スコア:0)
「高校 情報Ⅰ Python」って名前の教科書なんだから実装依存でよくね
Re: (スコア:0)
え、そういう流れだったのか。オブジェクトとして覚えることとデータの存在場所がどう繋がるのか分からんかった。
Re: (スコア:0)
pythonってCPythonに限るの?
Re: (スコア:0)
床や机の上でもいいし、箱に入っていてもいい。箱に入っていてもいいけど、1つの箱を異なる変数で参照することができるから、箱そのものを変数としてしまうと、解釈が困難になってしまう。
Re: (スコア:0)
ああ、こっちもあほな説明だって指摘してほしかったんか
「変数」の意味から調べなおせ
Re: (スコア:0)
数学を引き合いに出すと混乱の元だから止めとけ。n=n+1なんて、数学的にはナンセンスだから。
まあ、静的単一代入(SSA)で書けば混乱することはないけど、再代入を知らないだけだと思われそう。
Re: (スコア:0)
目くそ鼻くそ程度の違いしか感じられないな。この教科書で学んでる子がその違いを意識する必要があるのかな?
しょせんメタファーとしての限界はあるのだから、イメージしやすく理解しやすい方を優先した方がいいこともあるよ。
Re: (スコア:0)
と、この教科書で学んでる子がその違いを意識する必要性について書いてあるよね。
Re: (スコア:0)
実際誰がどれくらい困ったことになったのかねコレで?
Re: (スコア:0)
それを定量的に表すのは困難だけれど、元記事の示すコード例を読めば、理解に困るであろうことは容易に想像できるね
Re: (スコア:0)
こんな言語だと困る!って話を出すならラベルでも困るんよね
Re: (スコア:0)
箱に入れるというメタファーが変数の代入という概念と合いやすいから使われるんじゃね
数学の変数と類推しやすいし
どーしてもポインタを理解できない人が何割もいるんだぜ
まずは基本だけ教えて
参照とかポインタの話はまだまだ先なんかも
数学だってレベル別が普通なんだし情報なんかレベル違いすぎるやろうな…
どんな盆でも机上ではなぁ
Re: (スコア:0)
イメージしやすく理解しやすい方を優先した方がいいというのなら、それこそ名札と呼べばいいよね
Re: (スコア:0)
箱がないとすると、100GiBのデータをPythonの変数で扱えないことの説明ができない。
逆に箱があっても箱に名札をつければ同じことが説明できる。
Re: (スコア:0)
例として挙げられているPythonやJavaScriptなどの場合、変数が指し示すものは(数値など一部のプリミティブなデータ型を除き)オブジェクトの参照だよね。だから変数への代入は名札でのメタファーのほうが適切に説明できるということだろう。オブジェクトそのもの(名札を付ける対象)は箱のメタファーで説明するとしても。
Re: (スコア:0)
詳しくないから教えて欲しいんだけど、Pythonの変数で100GiBのデータって扱えないの?
メモリが許す限り制限はないと思ってた。逆に何GiBまでなら扱えるの?
Re: (スコア:0)
x = b" " * 100*2**30
Re: (スコア:0)
ChatGPT曰く
メモリ100GiBプラスアルファあればPythonの変数で扱えますよってことでいいのかな?
Re: (スコア:0)
ポインタの概念をもうちょっと平易な例えとして名札を出して来るのは上手いけど、ちょっと束縛感が弱いかな。
「xくーん、あれ? どこいったー」みたいな行方不明が起こりそうな気がして落ち着かない。
初学者って自分が分からないことをどう自由な面白い(間違った)解釈で片づけちゃったりするので、変数というのはなんか大変なものだという変な印象を持ちかねないのはちょっと怖いかな。
だいたい、JavaScriptのデバッガでも変数表とにらめっこすることになる。ので結局、教える順序が、
a. 最初から変数の真の姿を教えよう→まあ、常にそこまで考えるのは面倒くさいので意識せずこうい
Re: (スコア:0)
>「xくーん、あれ? どこいったー」みたいな行方不明が起こりそうな気がして落ち着かない。
メモリーリークってそういうことなんでは。
Re: (スコア:0)
>「xくーん、あれ? どこいったー」みたいな行方不明が起こりそうな気がして落ち着かない。
C言語とかならなんも考えずにやってるとしょっちゅう起こるし、
ガベージコレクションがある言語でも状況によっては起こるな。
さあさあ楽しい明示的なメモリ解放処理の実装のお時間だ。
レウキッポスとデモクリトスに怒られそうな人がいっぱい (スコア:0)
よく調べずに原子に原子って名前をつけた人たちはきっとあの世で…
Re: (スコア:0)
「箱」って説明でうまくいく言語って何があるんだろう?
C?
それでも名札で説明するほうがしっくりくるように思える。
Re: (スコア:0)
領域確保が必要な場合は箱がわかりやすい
あと元記事にも下記の記載がある
Re: (スコア:0)
だからそのプログラミング言語はなんだろう?という話なんだけどね。
個人的には領域確保こそ名札のほうが分かりやすいと思った。
確保された領域はポインタの指し示す先であって、「箱」には領域を指し示す「ポインタ」が入っているので。
と思うと名札と教えられたほうがいいんじゃないかなと。
は、アセンブラか!?
Re: (スコア:0)
陽子と中性子ならわかるが電子は分解できなくね
Re: (スコア:0)
今はな
Re: (スコア:0)
xという箱に1が入っていてyという箱に2が入っているとして、それらをzに入れたらzが3になってxとyは空にならないと箱というメタファーはおかしい。
Re: (スコア:0)
箱や名札よりは、(ひとつのことしか書けない、けど上書きが出来たりする)メモ用紙というメタファーが良いと思うな。そのメモ用紙に名札が貼られている。
Re: (スコア:0)
zにコピーしたんだよ
Re: (スコア:0)
「箱」ってさ、変数じゃなくてメモリ全体に対する例えに使うべき表現だと思うんだよね
Re:陽子、電子はこれ以上分解できない粒子 (スコア:1)
そうですか。
ちなみに変数の実体はレジスタかメモリの一領域であることはご存じの通り。
レジスタは、特定の変数だけが独占するものではない。