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 并且我希望能够传递一个自我。到这个方法。

有一点像:

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在函数内部更改(mutate)(如果它是可变的),但我们不能更改它引用的对象(这是您试图通过赋值执行的操作)。考虑:

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。鉴于这两条信息,我们可以进行所需的更改——当然,在这一点上,您可能最好一起摆脱func所有信息并直接使用setattr


可能还值得问一下您为什么要这样做。一般来说,你可以这样做:

self.test = "foo"

你为什么要写:

self.func(self.test)

反而?我可以理解您是否尝试这样做,因为您习惯于使用私有方法和属性。但这是蟒蛇。 “我们都是同意这里的成年人。” 只需依赖约定(_如果要警告用户不要修改变量,请在变量前面加上前缀,并__在调用名称修改以避免超类中的冲突时加上前缀)。

于 2012-11-14T19:45:54.807 回答