繁体   English   中英

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

[英]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.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()函数来再次读取相同的命名属性。

调用selfexpmetric只是对与a.num1相同的整数对象的a.num1 在方法内部为metric指定新值只会更改metric指向的名称; 它不会更改a.num1指向的对象。

Ned Batchelder的博客很好,解释了Python中名称和值的语义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM