1

これはおそらくディスカッション グループに適していると思いますが、私は言語の内部 (または言語自体) に精通していません。いずれにせよ、私を悩ませているのは:

Python がキーワードを使用して外部スコープとの干渉 (副作用) をnonlocal許可している場合、参照による引数の受け渡しを許可することで、関数の引数との同様の干渉を許可しないのはなぜですか。

現在可能:

>>> def outer():
       x = 1
       def inner():
           nonlocal x
           x = 2
           print("inner:", x)
       inner()
       print("outer:", x)

>>> outer()
inner: 2
outer: 2

そうでない理由 - または、次のような場合に何がうまくいかない可能性がありますか:

>>> def outer():
       x = 1
       def inner(byref x):
           x = 2
           print("inner:", x)
       inner(x)
       print("outer:", x)

>>> outer()
inner: 2
outer: 2

(「byref」や「nonlocal」などのキーワードを使用して説明します)。

4

4 に答える 4

2

Python は常に参照値を使用してパラメーターを渡します。こちらのリンクを参照してください。特に、ユーザーpeprから提供された詳細な応答を参照してください。

また、このリンクには、Python内でパラメーターが正確に渡される方法と、参照渡しをシミュレートできる方法に関するかなり詳細な議論があります-この質問に対する受け入れられた回答の編集を参照してください。

より深く掘り下げたい場合は、このEffbot の記事を参照してください。この記事には、同じトピックに関するいくつかの議論/議論も含まれています。

于 2013-08-20T06:53:48.617 に答える
1

Python には「変数」という概念がまったくないため、これは不可能です。Python プログラム内のすべての名前は、オブジェクトへの参照です。したがって、関数またはメソッドを呼び出すときにのみ、オブジェクトへの参照を渡すことができます。これを参照値渡しと呼びます。

ただし、既存の参照への参照を取得することはできません。この点で、参照は Python の世界で唯一の「非一流」市民です。

プログラム内で名前によって参照されるオブジェクトには、不変 (string、int、tuple など) と可変 (list、set、ほとんどのユーザー クラスなど) の 2 種類があります。

実際にオブジェクトの状態を変更する可変オブジェクトのメソッドを呼び出すことができます。これは、C++ などの言語でオブジェクトへの参照を渡すのと似ています。さらに、参照渡しは Python ではあまり意味がありません。

いくつかのリンクについては、Prahalad Deshpande の回答を参照してください。

于 2013-08-20T07:23:06.153 に答える
1

参照引数を許可するとします。では、次のことをするとどうなるでしょうか。

def f(byref x):
    print x
    print x
    x = 3

class Foo(object):
    def __init__(self):
        self.count = 0
    @property
    def x(self):
        count += 1
        return count

f(Foo().x)

ゲッターはいつ呼び出されますか? 何回呼ばれる?これは12 回出力されますか、それとも , 1then 2, or 2, then と出力され3ますか? セッターがないので、に代入しようとするとどうなりxますか?

変数が値の名前ではなく物を置く場所である別の言語では、これは問題になりません。Foo().x一度評価されたメモリ位置を持ち、fそのメモリ位置をx引数に使用します。Python では、そのようには機能しません。のメモリ位置を渡して1その内容を変更することはできません。これは、他のコード1が魔法2のように突然それを見つけるためです。Python の名前のセマンティクスと属性/項目の getter/setter は、参照引数を、既に混乱してバグが発生しやすい C++ などの言語よりもさらに混乱させます。

于 2013-08-20T07:57:16.217 に答える
0

Pythonintオブジェクトは不変です。の値を変更していると考えるときx、実際intには別のメモリ位置に新しい を作成し、xそれを参照するようになっています。

于 2013-08-20T06:36:24.810 に答える