在Python中,如何有效地返回布尔值而不会产生复制成本?

时间:2012-03-29 21:41:26

标签: python

假设我有一个包含一些字符串变量的类,我想声明一个is_valid方法,检查所有字符串变量都不是None / empty

看起来像这样:

class MyClass(object):
    var1 = None
    var2 = None
    var3 = None

    @property
    def is_valid(self):
        return self.var1 and self.var2 and self.var3

根据我的理解,这是检查所有值都已设置的 pythonic 方法。

现在,如果var1..3要保留一些非常长的字符串值,is_valid将返回其中的最后一个,在本例中为var3的值。如果我没错,python中的字符串是不可变的,因此会返回字符串的副本,从而使应用程序消耗更多内存。

它被认为是实施is_valid的更好解决方案:

    @property
    def is_valid(self):
        return self.var1 and self.var2 and self.var3 and True

或者我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:12)

  

...将返回该字符串的副本......

不正确的。将返回对字符串对象的引用。但您可以致电bool()将其转换为“更好”的值。

return bool(var1 and var2 and var3)

答案 1 :(得分:6)

返回一个对象总是在Python中返回对该对象的引用,无论它是否是不可变的。而不变性至多是制作副本的理由;例如tuple(another_tuple)只返回another_tuple,而list(another_list)则返回another_list的副本。对于不可变对象,没有理由进行复制。