为什么这个函数不会在__init__方法中触发?

时间:2012-01-11 12:53:56

标签: python

class test:
    def __init__(self, val):
        self.val = val
        self.val.lower()

为什么lower()不对此代码中的val内容进行操作?

4 个答案:

答案 0 :(得分:15)

你可能意味着:

self.val = self.val.lower()

或者,更简洁:

class test:
    def __init__(self, val):
        self.val = val.lower()

详细说明,lower()不会修改字符串(它不能,因为字符串是不可变的)。相反,它返回一个适当修改的字符串副本。

答案 1 :(得分:5)

documentation非常明确地说明了这一点:

  

返回字符串的副本,其中所有套接字符[4]都转换为小写。

答案 2 :(得分:2)

这是因为字符串是不可变的。你不能就地改变它们。

因此,您必须覆盖变量的值:

self.val = self.val.lower()

注意:当然,除非您的self.val不是字符串,而是在调用lower()方法后就地更改的一些可变对象。但事实并非如此(如果你创建了self.val的类,你可以这样做。)

使用lower()方法更改原位的可变对象示例:

>>> class LowerableList(list):
    def lower(self):
        for i, item in enumerate(self):
            self[i] = item.lower()

>>> a = LowerableList(['A', 'a', 'X', 'D'])
>>> a
['A', 'a', 'X', 'D']
>>> a.lower()
>>> a
['a', 'a', 'x', 'd']

有帮助吗?

答案 3 :(得分:0)

在Python中,有两种类型的函数会导致这种混淆。例如,您可以对列表进行排序:

>>> a.sort()

>>> a = sorted(a)

第一个在“a”中排序,但第二个排序“a”并返回新的排序列表。