2011-12-19 16 views
2

私はオブジェクトの配列を持っています。私は、リスト内の特定のオブジェクトを見つけてそれへの参照を返す関数を書くことに興味があります。変数によって参照されるオブジェクトを変更するには?

は、次のコードスニペットが可能であったと想像:

list1 = [1,2,3] 
def find(q): 
    return q[0] 
a = find(list1) 
a = 0 # This should change the object that "a" is referencing to. 
print list1 # [0, 2, 3] is desired as result. 

をC++でのポインタと関係するのは簡単ですが、どのように私はPythonでそれを行うことができますか?

+1

は、彼らは実際のオブジェクト、または不変のタイプ(INT、STR)はありますか? –

答えて

3

正確に同じセマンティクスを達成するには不可能かもしれませんが、get/setメソッドを使用してプロキシを使って同様のことを達成することはできますが、これが何で、なぜ必要なのかが明確ではないので、シンプル、とにかくここに私の解決策がある

def find(q): 
    return Pointer(q, 0) 

class Pointer(object): 
    def __init__(self, alist, index): 
     self.alist = alist 
     self.index = index 

    def get(self): 
     return self.alist[self.index] 

    def set(self, value): 
     self.alist[self.index] = value 

list1 = [1, 2, 3]  
p = find(list1) 
p.set(0) 
print list1 

出力:

[0, 2, 3] 
+1

私は多かれ少なかれ同じように投稿しようとしていた...あなたはより速かった。 +1 – gecco

+0

これは、不変型(例えば 'int')にのみ必要であることに注意してください。リスト内の項目が変更可能なタイプ(例:ユーザー定義のクラス)のインスタンスである場合、このプロキシは不要です。 –

+0

ニース。残念ながら、オブジェクトが、現在の削除された質問へのコメントにOPとして示されているように、オブジェクトが 'find'と参照解除の間のリストの位置を変更した場合は、うまくいきません。 –

0

数値オブジェクトはPythonでは不変なので、不可能です。

+1

私が説明したことを達成する別の方法がありますか? – Artium

+0

それは異なります。 BenHの答えはあなたのために働くかもしれません。実際のコードが可変オブジェクトを扱う場合、あなたが投稿した元のコードに似た何かがうまくいくでしょう(変数はPythonで実際に参照されるので)。 '= '演算子はリファレンスを再割り当てするのではなく、リファレンスを再割り当てすることを覚えておいてください。オブジェクトに対して突然変異関数を呼び出さなければなりません。 –

+2

これは不変性とは関係ありません。 'find'がリストを返す場合、' list [0] 'が別のオブジェクトを参照するようにすることはできません(ただし、そのオブジェクトを変更することはできます)。変数、コレクション項目などの値(参照)を参照するオブジェクトと混同しています。 – delnan

2

関数カリー化は、参照によるセマンティクスと同様の効果を得るための一つの方法です:

list1 = [1,2,3] 

def accessor(alist, index, value=None): 
    if value is not None: 
     alist[index] = value 
    return alist[index] 

def find(q): 
    def access_first(value=None): 
     return accessor(q, 0, value) 
    return access_first 

a = find(list1) 
print a() # This access the value that "a" references. 
print a(0) # This changes the object that "a" is referencing to and returns its value. 
print list1 # [0, 2, 3] is result. 

出力:

1 
0 
[0, 2, 3] 
+0

これは本当にカリング機能ですか?しかし、確かなアプローチのために+1。 –

+0

良い点。私は本当のカレーのほうになるようにソリューションを更新しました。 –

関連する問題