最初のコード:
リーリー最初のコード実行結果:
2 番目のコード:
リーリー2 番目のコードの実行結果:
Python を学習する過程で、文字列は不変型、リストは可変型であると言われました。つまり、文字列を変更したい場合は、実際に新しい文字列を作成してメモリの新しいアドレスに置きますが、元の文字列は変わりません。コードの最初の部分に示すように。
リストは異なります。リストは元のメモリ アドレスで直接変更できます。コードの 2 番目の部分に示すように。
私の質問:
変数型と不変型の根本的な違いは何ですか?なぜこのような違いが生じるのでしょうか?最初のコードでは、a を変更したい場合はアドレスを変更する必要がありますが、2 番目のコードでは、アドレスを変更せずに b がリストの値を直接変更できるのはなぜでしょうか。ここでの根底にあるロジックは何でしょうか?リスト自体が実際には値のコレクションであるということなのでしょうか、コレクション自体を反映し、値のコレクションをこの 1 か所にポイントしているだけなので、変更することができます。明確に表現できたか分かりませんが。
私はこのことに興味があるのです。つまり、リストとは正確には何ですか?なぜ直接変更できるのでしょうか?文字列は変更できません。さらに奥まで進んだ先にある二人とは?
実際、オブジェクトには変更可能と不変があります
リーリーpy
, 都是内部实现的问题, 如果我修改相应的方法, 将其写回到本身, 这样也能模仿出可变的现象, 就小小类似tuple
和list
的关系,既然想了解底层, 那就直接看源码吧:
这是字符串的
upper()
これがリストです
リーリーappend
Python 文字列がキャッシュされます。2 つの同一の文字列が異なる変数 a と b にある場合、それらの id(a) と id(b) は同じになります。
ただし、a と b の参照が 0 の場合、オブジェクトは自動的に破棄されます。
オリジナルポスターの例:
a = a.upper()
a の変数の内容が変更されており、古い内容には参照がなく、オブジェクトはガベージ コレクションによって破棄されます。
bはリストであり、変数であり、再度メモリを申請できます。同時に、b はコンテンツ参照を持っているため、破棄されません。
さらに深く進んで、PythonのCソースコードを見てください~
Python 言語で規定されている不変にすることもできます。
不変型はオブジェクト自体を変更するメソッドを提供しませんが、可変型はこれらのメソッドを提供します。これらの違いについては何も不思議なことはありません。
ハードウェアの観点から見ると、ユーザーに提供されるインターフェイスは規定に従って設定されており、メモリは固定された方法で動作します。可変性も不変性もありません。
上は、ユーザー操作を強化するために多数のハードウェア API をカプセル化するオペレーティング システム層です。Python を使用する場合は、Python プラグマティクスのみがコードの作成に使用されます。上記の前提の下で、現在の問題を説明すると、Python の可変性と不変性は Python の作成者によって規定されており、これらの規則を実装する方法は、異なる基礎となる API を呼び出すこと、または異なる基礎となる API を呼び出すことです。それぞれを組み合わせて実現します。これらの規定は Python プラグマティクスの形式でユーザーに提供され、最終的にコンピューターで実行できるように 0,1 にコンパイルされます。ユーザーにとって、可変オブジェクトと不変オブジェクトは言語によって提供される機能であり、一部の機能を完了できますが、コンピューターにとっては実際には違いはありません。