0

重複の可能性:
Python:参照によって変数を渡すにはどうすればよいですか?

私は次の場合があります:

class A:
    def __init__(self):
        self.test = ''
        self.func(self.test)
        print(self.test)
    def func(self,var):
        var = 'foo'

funcでself.varを変更したいのですが、selfを渡せるようにしたいと思います。この方法に。

少し似ている:

class A()
{
  public:
    char test[256];
    A() { func(test);}
  private:
    void func(char * var) { var = "foo"; }
};

私はしばらくC++を書いていませんが、それは私が目指していることの一種です。

4

1 に答える 1

0

残念ながら、よくわかりませんがC++、次のようなものが必要だと思います。

class A:
    def __init__(self):
        self.test = ''
        self.func("test")
        print(self.test)
    def func(self,var):
        setattr(self,var,'foo')

関数内で変更(変更)できるため(self.test変更可能である場合)、この方法で行う必要がありますが、参照するオブジェクト(割り当てで実行しようとしているオブジェクト)を変更することはできません。検討:

def func1(x):
   x.append('foo')
def func2(x):
   x = 'foo'

a = []
func1(a)
print a #['foo']  #mutated a in func1
func2(a)
print a #['foo']  #didn't change a in func2, only created a new local variable named `x` and assigned it to the string 'foo'

これを回避する唯一の方法は、変更可能なプロキシのようなオブジェクトを渡すことです。この場合、インスタンスをプロキシオブジェクト(self)および属性の名前(var)として渡すため、で何を変更するかがわかりselfます。これらの2つの情報があれば、必要な変更を加えることができます。もちろん、この時点では、funcすべてをまとめてsetattr直接使用するのがおそらく最善の方法です。


なぜ実際にこれをやりたいのかを尋ねる価値もあるでしょう。一般的に、あなたはただすることができます:

self.test = "foo"

なぜあなたは書きたいのですか:

self.func(self.test)

代わりは?あなたはプライベートメソッドと属性を持っていることに慣れているので、あなたがそれをやろうとしているのかどうかは理解できます。しかし、これはpythonです。 「私たちは皆、ここで大人に同意しています。」 規則に依存するだけです(変数を_変更しないようにユーザーに警告する場合は変数の前に付け__、スーパークラスでの衝突を避けるために名前マングリングを呼び出すために前に付けます)。

于 2012-11-14T19:45:54.807 に答える