2

Web では python の名前について多くの混乱があり、ドキュメントは名前についてそれほど明確ではないようです。以下は、Pythonの名前について私が読んだいくつかのことです。

  1. 名前はオブジェクトへの参照 (どこにある? ヒープ?) であり、どのような名前が保持されているかはアドレスです。(Javaのように)。

  2. Python の名前は C++ 参照 ( int& b) のようなもので、メモリ ロケーションの別のエイリアスであることを意味します。つまり、 forint aaメモリ ロケーションです。ifは、同じメモリ位置の別の名前であるint& b = aことを意味しますb

  3. 名前は、C の自動的に逆参照されるポインター変数に非常に似ています。

上記の記述のうち、正しい/正しいものはどれですか?

Python の名前にはある種のアドレスが含まれていますか、それとも単なるメモリ位置の名前 (C++&参照など) ですか?

Python名はスタックまたはヒープのどこに保存されますか?

EDIT:

http://etutorials.org/Programming/Python.+Text+processing/Appendix+A.+A+Selective+and+Impressionistic+Short+Review+of+Python/A.2+Namespaces+から以下の行を確認してください。 and+Bindings/#

(修飾されている可能性がある) 名前が代入の右側または単独の行にある場合は常に、その名前はオブジェクト自体に逆参照されます。アクセス可能なスコープ内でバインドされていない名前は、逆参照できません。そうしようとすると NameError 例外が発生します。名前の後に左右の括弧が続く場合 (カンマで区切られた式が間にある可能性があります)、オブジェクトは逆参照された後に呼び出されます。呼び出し時に正確に何が起こるかは、Python オブジェクトに対して制御およびオーバーライドできます。ただし、一般に、関数またはメソッドを呼び出すと何らかのコードが実行され、クラスを呼び出すとインスタンスが作成されます。例えば:

pkg.subpkg.func() # 名前空間から関数を呼び出す

x = y # 'y' を deref し、同じオブジェクトを 'x' にバインドします

これは理にかなっています.それがどれほど真実であるかをクロスチェックしたいだけです.コメントと回答をお願いします

4

3 に答える 3

4

名前はオブジェクトへの参照です

はい。Python変数のセマンティクスを理解したいだけなら、オブジェクトがどこにあるかは気にしないでください。それらはメモリのどこかにあり、Python実装がメモリを管理します。それをどのように行うかは、実装(CPython、Jython、PyPy ...)によって異なります。

Pythonの名前はC++参照のようなものです

ではない正確に。C ++で参照を再割り当てすると、実際には参照されているメモリ位置が再割り当てされます。

int i = 0;
int &r = i;
r = 1;

それは本当ですi == 1。可変コンテナオブジェクトを使用する場合を除いて、Pythonでこれを行うことはできません。C++参照の動作に最も近いのは

i = [0]   # single-element list
r = i     # r is now another reference to the object referenced by i
r[0] = 1  # sets i[0]

Cで自動的に逆参照されるポインタ変数と非常によく似ています

いいえ、その場合、上記の点でC++参照に類似しているためです。

Pythonの名前にはある種のアドレスが含まれていますか、それとも単なるメモリ位置の名前ですか?

単純な実装を想定すると、前者は真実に近いです(ここでも、PyPyはCPythonとは異なる動作をする可能性があります)。いずれにせよ、Python変数は保存場所ではなく、メモリ内のどこにでも存在する可能性のあるオブジェクトのラベル/名前です。

Pythonプロセスのすべてのオブジェクトには、CPythonでメモリアドレスを返す関数を使用して取得できるIDがあります。id2つの変数(またはより一般的には式)が同じオブジェクトを参照しているかどうかは、それらをチェックすることで確認できますid。または、以下を使用して直接確認できisます。

>>> i = [1, 2]
>>> j = i       # a new reference
>>> i is j      # same identity?
True
>>> j = [1, 2]  # a new list
>>> i == j      # same value?
True
>>> i is j      # same identity?
False
于 2012-09-08T09:40:15.583 に答える
2

Python の名前は、まあ、名前です。オブジェクトと名前があります。それだけです。

オブジェクトを作成すると、たとえば、ヒープのどこか[3, 4, 5]にオブジェクトが作成されます。方法を知る必要はありません。これで、名前に割り当てることで、このオブジェクトを対象とする名前を付けることができます。

x = [3, 4, 5]

つまり、代入演算子は値ではなく名前を割り当てます。x いいえ、それは 単にオブジェクト[3, 4, 5]を指す名前です。[3, 4, 5]これを行う:

x = 1

元の[3, 4, 5]オブジェクトを変更せず、オブジェクト1に x という名前を割り当てます。また、ほとんどの式は のようですが、一時的な[3, 4, 5]ものも作成することに注意してください。8 + 3そのテンポラリーに名前を割り当てない限り、すぐに死んでしまいます。参照されていないオブジェクトを存続させ、それらをキャッシュするためのメカニズムはありません (たとえば、少数の CPython を除きますが、それは別として)。たとえば、これは失敗します。

>>> x = [3, 4, 5]
>>> x is [3, 4, 5] # must be some object, right? no!
False

ただし、これは単なる割り当てです (Python ではオーバーロードできません)。実際、Python のオブジェクトと名前は、自動的に参照カウントされ、(少なくとも CPython では) 参照されなくなると死ぬことと、代入時に自動的に逆参照しないことを除いて、ポインターを自動的に逆参照するように非常にうまく動作します。

このメモリ モデルのおかげで、たとえばインデックス操作をオーバーロードする C++ の方法は機能しません。代わりに、 「割り当て可能な」ものを返すことができないため、Python は__setitem__andを使用します。__getitem__さらに、演算子+=*=などは、一時変数を作成し、その一時変数を名前に割り当てることによって機能します。

于 2012-09-08T09:51:11.467 に答える
1

Pythonオブジェクトはヒープに格納され、参照カウントを介してガベージコレクションされます。

変数はJavaのようにオブジェクトへの参照であるため、ポイント1が適用されます。私は、C ++またはCで自動的に逆参照されるポインター変数を使用して、それらを呼び出すことに慣れていません。

最終的に、インタープリター構造内のアイテムの検索を行うのはPythonインタープリターです。これは通常、Pythonリスト、辞書、およびその他のそのような抽象コンテナーです。名前空間はdict、たとえば(ハッシュテーブル)を使用します。ここで、名前と値は他のPythonオブジェクトへのポインターです。これらは、マッピングプロトコルによって明示的に管理されます。

Pythonプログラマーにとって、これはすべて隠されています。オブジェクトがどこにあるかを知る必要はありません。オブジェクトを参照しているものがある限り、オブジェクトはまだ生きているというだけです。Pythonでコーディングするときに、これらの参照を渡します。

于 2012-09-08T09:38:50.563 に答える