[英]Python class: passing in self.var as a method argument yields no assignment?
我得到似乎在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
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()
函数来再次读取相同的命名属性。
调用selfexp
, metric
只是对与a.num1
相同的整数对象的a.num1
。 在方法内部为metric
指定新值只会更改metric
指向的名称; 它不会更改a.num1
指向的对象。
Ned Batchelder的博客很好,解释了Python中名称和值的语义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.