Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[python] 皆さんはどのようにして参照の概念を理解しましたか?

Pythonを教えているのですが、参照の概念を理解するのに苦戦している方がいます。

例えば、以下のコードです。

x = ["a", [1, 2, 3], "b"]
y = x[1]
z = y

y = 1

print(x) # => ["a", [1, 2, 3], "b"]
print(y) # => 1
print(z) # => [1, 2, 3]

このようなオブジェクトの参照関係がうまく掴めず、特に

  • 多次元リスト(リストの中のリストなど)
  • 辞書内のリスト(その中に辞書があるなど)

といった複雑なデータ構造になると、変数がどこを参照しているのか追えなくなるようです。

関数にリストを渡したときに、「どのような操作をしたら元の変数に影響が出るのか?出ないのか?」という点も、まだ直感的に理解できていないようで、良い教材や解説方法を探しています。

いくつかYouTubeの動画も参考にしてもらいましたが、参照について細かく解説しているものは少なく、なかなか「これだ!」というものが見つかりませんでした。

参考に見てもらったyoutube

How variables work in Python | Explained with Animations [See description/first comment]
https://www.youtube.com/watch?v=0Om2gYU6clE

WHY IS THE STACK SO FAST?
https://www.youtube.com/watch?v=N3o5yHYLviQ

WHY IS THE HEAP SO SLOW?
https://www.youtube.com/watch?v=ioJkA7Mw2-U

Understand the weirdness. How Python Passes Arguments.
https://www.youtube.com/watch?v=D3IffJOwDY0

MIT 6.100L Introduction to CS and Programming using Python, Fall 2022
https://www.youtube.com/playlist?list=PLUl4u3cNGP62A-ynp6v6-LGBCzeH3VAQB

【Pythonプログラミング入門】ミュータブル・イミュータブルを解説!〜VTuberと学習〜 【初心者向け】
https://youtu.be/PQjdqQbjnLU?si=cW3E1RyjXyVF3vbe&t=234
日本でよく売れてる本の人でもこの数分程度しか参照の事は説明してない

  • 3:54 参照とは
  • 4:55 関数の引数は参照渡し
  • 6:58 エンディング

お尋ねですが

皆さんは、参照の概念をどのように理解・習得しましたか?
また、初心者が分かりやすい教材や説明方法があれば教えていただけると助かります。

0

そもそも例示されたソースはPythonってクソだわ案件なのでここから教えこもうとするのは勘弁してあげて欲しいと思います.
型アノテーションすらない言語で参照を理解すること自体無謀.

概念ごと理解させてあげるならCで教えるのがいいんでは.
実用上ポインタを使わざるを得ませんからね.
いうて配列が絶対に値型にならないのは変わらないんですが…

元の配列に影響が出る云々に関しては今日日引数を直接操作するようなコードを書くなということで1つ.

0Like

皆さんはどのようにして参照の概念を理解しましたか?

質問者さんはどうなんでしょうか?
私自身はもう覚えていませんし、あまり一つ一つに拘らない方が良いかと思います。

良い教材や解説方法を探しています。

何事も経験だと思います。トライ&エラーの精神で、サンプルコードをいじくり回して動きを理解していくしかないです。
”魔法の教科書”のようなものを探し求めるのは時間の無駄かもしれません。

複雑なデータ構造になると、変数がどこを参照しているのか追えなくなるようです。

経験者でも普通にあると思います。デバッグして確認すれば良い話です。
むしろ分かりにくいデータ構造はバグの原因になるのではないでしょうか。

初心者の方の分からないことについて考えすぎると「プログラミング」そのものを嫌いになってしまわないか心配です。勉強を進めていく内に自然に分かるようになることもあるので楽しくプログラミング覚えていただければ良いなと思います。

1Like

自分はC言語の後にPythonを使い始めたのでポインタの値を渡してるという説明でなんとなく理解できました。
でもPythonしかやってない人にポインタやれと言われても余計に混乱しますよねえ…
最後の動画と同じような感じですがid()で実際のアドレスを見てもらいながら実行すると理解しやすい…かも…?

1Like

参照というよりポインタの部分も含まれていてゴチャゴチャしてますね

y または最終的にはzですが に値を入れている部分はJSONのデータを渡して
ここから必要な部分を取り出す課題を与えればすぐにわかるでしょう
データ取り出し、ポインタの概念に近い部分です

参照はpythonが特殊すぎて他で役に立たないというか混乱まであるので
他の素直な言語でまず学ばれた方が良いです

高級言語なので参照の学習には不向きです
ExcelVBAで参照を学習する人はいないかと思います

1Like

複雑なデータ構造になると、変数がどこを参照しているのか追えなくなるようです。

なんでもかんでも適当に変数定義してるのが原因かと見ます。

私自身Pythonは近年始めたばかりなので、説明材料に成るかは解りませんが、classの基本的な書き方を覚えて、クラスに変数定義させて変数を整理させるクセをつけさたほうが良いかもしれません。

たとえばx = ["a", [1, 2, 3], "b"]のようなデータとしては必要、しかしlistに規則性のないものを詰め込ませず、クラスを作って次のように変数に名前を付けさせるような感覚で整理させます。

class x:
  foo: str = "a"
  bar: list = [1, 2, 3]
  baz: str = "b"

print(x.foo) # a
print(x.bar) # [1, 2, 3]
print(x.baz) # b
x.baz = "c"
print(x.baz) # c

Pythonは不思議なことにstaticへ変えなくてもクラス内の変数を直接扱えます。
データ構造がかなり複雑化するケースは私個人こんな感じでクラスを使ったりします。

無論こんなことしなくてもnamedtuple@dataclass使うのもアリかと思います。

「初心者が分かりやすい」というより、その当人が理解出来る、どこまで変数を整理させられるかどうかなので、相手の苦にならず時間をかけてならしていけばと思います。

1Like

自分がどのように理解したかと言われると、だいぶ昔のことだし、たぶんS式の理解が基本になっているという、一般的でないルートで理解したと思います。

pythonに限らず、変数と値の関係については、以下のようなことが理解できれば、わかるようになると思っています。
・変数を入れ物ととらえるのではなく、値(オブジェクト)を指していると理解する。
・配列などのオブジェクトそのものも、入れ物でなく、他の値を指している。
・オブジェクトにはミュータブルなものとイミュータブルなものがある。

以下のポストはDeep CopyとShallow Copyの違いを説明するために書いたものですが、変数と値の関係についての理解の助けにはなると思います。
https://qiita.com/ypsilon-takai/items/97ffcd92d9c60b62b3c6

1Like

Pythonにはidというインスタンスアドレスを返す関数があります
参照とはすなはちアドレスを持つことなので、サンプルコードにId関数を挟みながら動作を追えば理解の足掛かりになるでしょう
またPythonのオブジェクトには参照が共有されるものとされないものがあります
プリミティブな値に関しては後者に当たります
「数値と文字列の参照はどんな場面でも共有されない」と捉えておくと(厳密には完全な同一値を有する場合のみ共有しますが)分かりやすいでしょう
つまりはidで取得されるアドレスの値が同一か否かで参照の共有非共有は把握できます
Pythonの場合は使用する構文によっても参照か複製かが変わりうるので、まずアドレスというものの実体を掴むために、idで確認する癖をつけてもらうのが先決でしょう

0Like

Your answer might help someone💌