我在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
答案 0 :(得分:6)
metric
只是一个局部变量,不是对该属性的引用。当您调用函数或方法时,python会传入引用的对象。这意味着传递a.num1
或a.num2
引用的值,而不是属性。在您的示例中,metric
在两种情况下均为0
,因为表达式a.num1
和a.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中名称和值的语义。