2011-09-29 13 views
1

Python関数(def)をプッシュして、不変型の場合でも参照によって結果を返す方法はありますか?Python:参照による変数(ハック)

提案アプリケーション(サブルーチンとしてスワップ):
def swap(a, b):
.....a,b = b,a

注:は、質問の答えない関数として
def swap(a, b):
.....return b,a

作品!


例えば、インプレースで動作する関数random.shuffle(a)があります。 私の考えは、Fortran/C++で書かれた関数を呼び出してPython経由で呼び出すことです。それは動作しますが、欠点もあります。
注:
lambda」と「def」の両方には次の問題があります。a, b = swap(a, b)これは変数の順序に注意が必要です。私の提案(もし可能ならば)では、サブルーチンは次のように使われます:swap(a, b)変数の順番を気にする必要はありません。

+0

私は右のそれを得た場合、私は知らないが、あなたは 'lambda'機能を探しているように見えます。あなたはより詳細な説明と例を与えることができますか? – heltonbiker

+1

いいえ、あなたは確かにそうしたくありません。 – JBernardo

+1

"lambda"と "def"(関数として)の両方に次の問題があります: 'a、b = swap(a、b)'。私の提案(可能であれば)では、サブルーチンは 'swap(a、b)'として使用されるので、変数の順序を気にする必要はありません。 – Developer

答えて

4

Pythonのすべての名前は参照です。そして、いいえ、利用可能な(例えばC++の意味での)「アウト」参照はありません。変更可能なオブジェクトを渡す必要がありますし、関数内で変更することができます。しかし、もう一度、新しい価値を返すことが好ましい方法であるはずです。

+1

私の提案の利点を実証する質問に私のコメントを参照してください。 – Developer

+1

@Developer:いいえ、それは不可能であるだけでなく、利点はありません。それは慣用的なコードではありません。慣用的な交換は 'a、b = b、a'です。 –

+0

スワップはそのアイデアを説明するための一例にすぎないことに注意してください。 – Developer

3

いいえ、指定されたオブジェクトを参照として取得するため、そのようなものは存在しませんが、再割り当てすると元に戻すことはできません。

この場合、変更可能なコンテナ(list、dict、属性を持つオブジェクト)を操作する必要があります。

2

Pythonでは、 "書き込みポインタ"を渡す方法はありません。オブジェクトと名前を渡すことができます(つまり、呼び出し先はsetattrなど)。リストとインデックスを渡すこともできます。コンテキストフリーの "変更可能なセルのアドレス"というようなものはありませんが、コンテキスト(名前空間、どの配列)も必要とする名前またはインデックスしかありません。

一般的に、書き込みポインタを渡す必要がある場合、Pythonの解決策は、呼び出し元が値を設定するために使用できる「セッター」関数を渡すことです。例えば

def foo(setter): 
    setter(42) 

def bar(): 
    x = [1,2,3,4] 

    def setFirst(value): 
     x[0] = value 

    foo(setFirst) 

    print x[0] # --> 42