Python类:传入self.var作为方法参数不会产生任何赋值?

时间:2014-04-22 15:22:53

标签: python class python-2.7 self

我在python中得到了好奇的行为。我无法弄清楚这是一个怪癖还是我做错了什么。为什么传入一个对象的self.var作为其方法之一的参数不允许我分配已经初始化的self.var?

class Test():
    def __init__(self):
        self.num1 = 0
        self.num2 = 0

    def selfexp(self, n, metric):
        result = n ** n
        metric = result
        print metric

a = Test()

a.selfexp(2, a.num1)
a.selfexp(5, a.num2)

print a.num1
print a.num2

输出:

4
3125
0 # expected 4
0 # expected 3125

2 个答案:

答案 0 :(得分:6)

metric只是一个局部变量,是对该属性的引用。当您调用函数或方法时,python会传入引用的对象。这意味着传递a.num1a.num2引用的,而不是属性。在您的示例中,metric在两种情况下均为0,因为表达式a.num1a.num2的结果均为0

如果您想告诉方法要分配的属性,请使用setattr()并传入字符串

def selfexp(self, n, metric):
    result = n ** n
    setattr(self, metric, result)
    print getattr(self, metric)

a.selfexp(2, 'num1')

我还使用getattr() function再次读取相同的命名属性。

答案 1 :(得分:3)

当您致电selfexp时,metric只是对a.num1的同一整数对象的引用。在方法内为metric分配新值只会更改名称metric指向的内容;它不会更改a.num1指向的对象。

Ned Batchelder有一个很好的blog post,它解释了Python中名称和值的语义。