Lao Qi から Python を学び、変数と参照オブジェクトについて詳しく学びます

WBOY
リリース: 2016-06-16 08:41:49
オリジナル
1171 人が閲覧しました

「永遠に強力な関数」の講義で、読者に変数について簡単に紹介してきました。それ以来、変数を使用するたびに、代入という操作が必要になります。この講義では、変数と代入とその理由を読者に明確に理解してもらうために、これら 2 つのことに再度言及します。もちろん、最終的にこの目標を達成できるかどうかは、分かりやすさに大きく依存します。理解できない場合は、私の言ったことは十分ではないということですので、私に連絡してください。またお手伝いします。

変数とオブジェクト

著者は「Python を学ぶ」という本で、変数、オブジェクト、参照の関係を非常にわかりやすく説明しています。私はここで彼からとてもインスピレーションを受けています。著者のマーク・ラッツ氏の傑作に感謝します。

「Python の学習」に視点を適用する: 変数には型はありませんが、オブジェクトには型があります

Python では、変数を使用する場合、事前に宣言する必要はなく、使用するときに変数に値を代入するだけです。ここで特に強調したいのは、変数が使用されている限り、その変数に値を割り当てる必要があるということです。

つまり、このままではうまくいきません。

コードをコピー コードは次のとおりです:

>>>x
トレースバック (最後の呼び出し):
ファイル「」、1 行目、
NameError: 名前「x」が定義されていません

繰り返しの注意事項: エラー メッセージに必ず注意してください。値を代入せずに単に変数を記述すると、Python は変数が定義されていないとみなします。代入は null 以外の値だけでなく、null 値も許可されます。

コードをコピー コードは次のとおりです:

>>> x = 3
>>> lst = []
>>> 単語 = ""
>>> my_dict = {}

前の説明で、変数が線を介してオブジェクトに接続されている (具体的には int/list など) というアナロジーを提案しましたが、このアナロジーは多くの人に受け入れられました。私、ラオ・チーの最初の作品と考えられています。したがって、厳密な言語を使用して変数を記述したい場合、変数は、オブジェクトを指す名前空間を持つシステム テーブルの要素として理解できます。あまりにも深刻すぎて、私のたとえを理解するのは難しいです。変数とは、システム内に存在するもので、オブジェクトと線で結ばれ、魚を釣ることができます。

ターゲットはどこですか?想像力を働かせてください。マシンのメモリ内に、システムはいわゆるオブジェクトを含むスペースを割り当てます。場合によっては数値が配置され、場合によっては文字列が配置されます。数値を入力した場合は int 型、文字列を入力した場合は str 型になります。

次に、先ほど述べた変数が自身の能力を使ってオブジェクトを自身に接続します(ポインタがオブジェクト空間を接続します)。これが参照です。参照が完了すると、割り当てが実現されます。

上の図を参照してください。変数とオブジェクトの関係が明確に示されています。したがって、厳密に言えば、メモリ空間に配置されたオブジェクト (つまりデータ) のみが型を持ち、変数には型がありません。まだ完全に理解していない場合は、別の比喩を使用してみましょう。変数は漁師のようなもので、湖は記憶のようなものです。湖にはたくさんの魚がいて、あらゆる種類の魚が存在し、それらはオブジェクトです。漁師 (変数) の仕事は、何らかの方法 (ルアー) で釣り糸を通して自分と魚を結び付けることです。まあ、魚の種類もいて、銀鮒、フナ、太刀魚(太刀魚も湖に行ったんですけど、淡水の太刀魚ですか?ははは、くだらない話ばかりです、真剣に考えないでください)、そして漁師さん(変数)にはこのタイプはありません、彼はさまざまなタイプの魚を捕まえます。

この比喩はひどいです。とりあえず我慢して理解してください。良い比喩がある場合は、忘れずに共有してください。

同じ変数が同時に 2 つのオブジェクトを指すことはできますか? 2 つの異なるボートに乗ることはできません。そうなったらどうなるでしょうか?

コードをコピー コードは次のとおりです:

>>> x = 4
>>> x = 5
>>>x
5

変数 x は最初にオブジェクト 4 を指し、次にオブジェクト 5 を指します。後者が解放されると、自動的に最初のオブジェクト 4 に接続します。もう一度 x を見ると、参照されているオブジェクトは 5 です。 4はどうでしょうか?参照する変数がなくなると、ゴーストになります。 Python は非常にケチで、メモリ内にゴーストが存在することを絶対に許可しません。これらはすべてガベージとみなされ、Python にはガベージを自動的に回復するメカニズムが備わっています。

インターネットでグラフィックの説明を見つけました。非常に優れているので、ここに引用します (出典: http://www.linuxidc.com/Linux/2012-09/69523.htm)

コードをコピー コードは次のとおりです:

>>> a = 100 #メモリ空間内のオブジェクト 100 への変数 a の参照を完了します

以下に示すように:

そして、彼はまた同じことをしました:

コードをコピー コードは次のとおりです:

>>> a = "こんにちは"

以下に示すように:

メモリ内の元の 100 はゴミとして収集されました。なお、この収集処理はPythonが自動的に行ってくれるので、特に心配する必要はありません。

では、Python はどのようにしてガベージ コレクションを実行するのでしょうか? Quora でこの質問をした人もいます。その答えは非常に興味深いものだと思いますので、リンクして読んでみてください。 Python (プログラミング言語): Python のガベージ コレクションはどのように機能しますか?

と ==

の効果

上記のプロセスの原則が明確になったので、さらに一歩進めることができます。

コードをコピー コードは次のとおりです:

>>> l1 = [1,2,3]
>>> l2 = l1

この操作では、2 つの変数 l1 と l2 はオブジェクトを参照します (両方とも [1,2,3])。どうすれば見えますか? [1,2,3] が l1 によって変更され、l2 によって参照されるオブジェクトも変更される場合、このビューは確認されます。

コードをコピー コードは次のとおりです:

>>> l1[0] = 99 #オブジェクトを [99,2,3] に変更します
>>> l1 #変更されました
[99、2、3]
>>> l2
[99、2、3]

別の方法:

コードをコピー コードは次のとおりです:

>>> l1 = [1,2,3]
>>> l2 = [1,2,3]
>>> l1[0] = 99
>>> l1
[99、2、3]
>>> l2
[1、2、3]

l1 と l2 は同じオブジェクト [1,2,3] を指しているように見えますが、実際、メモリ内ではこれら 2 つは互いに無関係です。内容的には全く同じです。それは、水の中で成長している2匹の魚が、両方とも2人によって捕まえられ、同じ魚ではないふりをしているようなものです。したがって、l1 を通じて参照オブジェクトが変更されても、l2 は変更されません。

これはさらにテストできます:

コードをコピー コードは次のとおりです:

>>> l1
[1、2、3]
>>> l2
[1、2、3]
>>> l1 == l2 #2 が等しいということは、内容が同じであることを意味します
本当です
>>> l1 is l2 #is は、メモリ内の 2 つの参照オブジェクトのアドレスが同じかどうかを比較します
False #前のテストでは、これら 2 つのことが示されました

>>gt;>gt;>l3 = l1 #ちなみにこの場合、l3 と l1 は同じオブジェクトを適用します
>>> l3
[1、2、3]
>>> l3 == l1
本当です
>>> l3 は l1 #is結果は True
本当です

一部のオブジェクトにはコピー機能があります。この機能で取得したオブジェクトは新しいオブジェクトですか、それとも同じオブジェクトを参照していますか?上記と同様の実験を行ってみるとわかります。例:

コードをコピー コードは次のとおりです:

>>> l1
[1、2、3]
>>> l2 = l1[:]
>>> l2
[1、2、3]
>>> l1[0] = 22
>>> l1
[22、2、3]
>>> l2
[1、2、3]

>>> adict = {"name":"qiwsir","web":"qiwsir.github.io"}
>>> bdict = adict.copy()
>>> {'web': 'qiwsir.github.io', 'name': 'qiwsir'}
>>> adict["メール"] = "qiwsir@gmail.com"
>>> 中毒者
{'web': 'qiwsir.github.io', 'name': 'qiwsir', 'email': 'qiwsir@gmail.com'}
>>> {'web': 'qiwsir.github.io', 'name': 'qiwsir'}


ただし、Python は、小さい数字など、常に上記の方法でカードをプレイするわけではないことに注意してください。


コードをコピー

コードは次のとおりです:

>>> x = 2
>>> y = 2
>>> x は y
本当です
>>> x = 200000
>>> y = 200000
>>> 誤り
>>>x = 'こんにちは'

>>> = 'こんにちは'
>>> x は y
本当です
>>> x = 「あなたの名前は何ですか?」
>>> y = 「あなたの名前は何ですか?」
>>> x は y #小さい数字だけでなく短い文字列も可能です
誤り

代入は単なる等号ですか?上記のことから、= の機能は変数ポインタがオブジェクトを指すようにすることであると結論付けることができます。ただし、もう少し深く掘り下げることもできます。見てみましょう。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート