1

私は言語の説明についての本で見ました

On the other hand, a name can be bound to no object (a dangling pointer), 
one object (the usual case), or several objects (a parameter name in a 
 recursive function).

名前を複数のオブジェクトにバインドするにはどうすればよいですか?たとえば、すべての要素が同じ名前でインデックスが付いている配列と呼ばれるものではありませんか?ここの例のような再帰関数の場合:

x = 0
def f(y):
    global x
    x += 1
    if x < 4 :
        y +=100
        f(y)

    else: return
f(100)

名前テーブルには、再帰的に再現されている初期値に名前yが既にバインドされているため、名前は再帰的に作成される複数の値にバインドされていますか?y

編集済みここでビジュアライザーを押すだけで、何が生成されるかを確認できます。:)

4

4 に答える 4

6

いいえ。名前は1つのオブジェクトにバインドされています。Pythonについて話しているとき、Pythonは特定のコンテキストで単一のオブジェクトにバインドされているか、まったく存在していません。

何が起こるかというと、内部の仕組みにはいくつかの「レイヤー」で定義された名前が付いている可能性がありますが、コードにはそのうちの1つしか表示されません

名前が再帰関数の変数である場合、現在実行中のコンテキストで名前にバインドされているものだけが表示されます-Pythonで関数呼び出しが発生するたびに、実行フレームは、ローカル変数への参照を含む実行中のコードはフリーズします。呼び出された関数で、新しい実行フレームが作成され、そこで、変数名は、呼び出されたコンテキストにある新しい値に再度バインドされます。あなたのコードはこのインスタンスを「見る」だけです。

次に、Pythonのグローバル変数と組み込みオブジェクトの問題があります。名前が関数実行コンテキストのローカル変数でない場合、モジュールのグローバル変数で検索されます(ここでも、そのうちの1つだけが表示されます) .ANd名前がグローバルでdefiendでない場合、それらは、Pythonが globals().__builtins__最後の呼び出しでそれを探します。

于 2012-10-01T15:58:40.400 に答える
3

私があなたを正しく理解しているなら、あなたはPythonが異なるスコープで変数を作成するためにどのようなルールを持っているかについて尋ねています。Pythonは、関数レベルで字句スコープを使用します。

y作成したコードで何を取得しているのかを正確に判断するのは困難ですが、スコープごとに異なる値が関連付けられている場合があります(y再帰の各レベルで定義された値を持つ)が、コードは一度に1つずつ表示できるようになります(操作しているスコープで定義された値)。

Pythonのスコープ規則を実際に理解するには、PEP227を参照してください。また、このStackOverflowの質問もご覧ください。

最後に、Pythonでの「名前」についてインテリジェントに話すことができるように、Pythonが「オブジェクトごとの呼び出し」言語である方法について読むことをお勧めします。

この時点で、Pythonは「名前付きテーブル」の代わりに辞書を使用して、特定のスコープでアクセス可能なものを保持していることを理解できます。詳細については、この回答を参照してください。これが意味することは、1つのスコープに同じ名前の2つを含めることはできないということです(同じ理由で、Pythonディクショナリに同じキーを2つ持つことはできません)。したがって、y別のスコープのディクショナリに存在する場合でも、現在のスコープのディクショナリ内の変数にしかアクセスできないため、アクセスする方法はありません。

于 2012-10-01T16:01:03.903 に答える
0

重要なのは:

いくつかのオブジェクト(再帰関数のパラメーター名)。

パッセージはほぼ確実に配列を参照していませんが、再帰関数(または任意の関数ですが、再帰関数は一度に複数のアクティブ化を行う可能性があります)では、パラメーターが異なる値にバインドされる可能性があるという事実を単に参照しています各再帰呼び出し。

これは、すべてのスタックフレームでそのような各オブジェクトにアクセスできることを意味するものではありません。実際、この手法のポイントは、各スタックフレームでそのような値にアクセスできるのは1つだけにすることです。

于 2012-10-01T16:18:03.130 に答える
0

まず、本の文章は明示的に Python に関連していないことを質問で言及する必要があります (jsbueno が書いたように、Python では 1 つの名前が正確に 1 つのオブジェクトにバインドされています)。

とにかく、オブジェクトにバインドされていない名前は少し不正確です。一般に、名前は変数に関連しており、ダングリング ポインターに関連する名前はそのポインター変数の名前です。

変数のスコープ(つまり、変数が使用されるコードの部分)について話すとき、1 つの変数名は一度に 1 つの値に対してのみ使用できます。ただし、その変数について考える部分とは関係なく、コードの他の部分が存在する場合があります。コードの他の部分では、同じ名前を使用できます。ただし、同じ名前の 2 つの変数は完全に分離されています。これは、関数本体の場合でもローカル変数の場合です。言語が再帰を許可する場合、同じ関数の別の呼び出しであっても、ローカル変数の別の分離されたスペースを作成できる必要があります。

Python では、各関数は外部変数にもアクセスできますが、内部のローカル変数を使用する方が一般的です。名前に何らかの値を割り当てると、ローカル空間に作成されます。

于 2012-10-01T20:07:15.837 に答える