在python中传入自我数据

时间:2011-08-11 02:43:53

标签: python instance-methods

您能否澄清下面的self.add(x)self.data.append(x)的工作原理是一样的? 也就是说,self.add(x)如何知道附加到列表中,因为我们没有明确说明self.data.add(x)?当我们说明y.addtwice('cat')时,'cat'已添加到'self',而不是self.data

class Bag:
    def __init__(self):
        self.data=[]
    def add(self,x):
        self.data.append(x)
        return self.data
    def addtwice(self,x):
        self.add(x)
        self.add(x)
        return self.data

>>> y = Bag()
>>> y.add('dog')
['dog']
>>> y.addtwice('cat')
['dog', 'cat', 'cat']

5 个答案:

答案 0 :(得分:4)

因为addtwice调用在self上定义的方法,并且因为self.data是“可变类型”,所以addtwice对add的调用将最终附加self.data的值。 add依次调用self.data.append

在计算机程序中调用函数时,您可以将该过程视为一系列替换,如下所示:

# -> means (substitution for)
# <= means "return"
y = Bag()
y.add('dog') -> 
     y.data.append(x) ->
         #(machine code)
     <= y.data
# at this point, at the command propmt, python will just print what was returned.
y.addtwice('cat')->
     y.add('cat')->
         y.data.append(x) ->
             #(machine code) 
         <= y.data
     #nothing cares about this return
     y.add('cat')->
         y.data.append(x) ->
             #(machine code)
         <= y.data
     #nothing cares about this return either
     <= y.data
# at this point, at the command propmt, python will just print what was returned.

self本身在任何情况下都不会真正附加。 self.data是。

答案 1 :(得分:1)

self.add(x)调用实例方法add,后者又调用self.data.append(x)

答案 2 :(得分:1)

  

当我们陈述y.addtwice('cat')时,'cat'被添加到'self',而不是self.data

这是不正确的。 cat实际上已添加到self.data。为什么你认为它被添加到self

y.add('dog')与执行Bag.add(y, 'dog')相同。所以add确实在做y.data.append('dog'),习惯上使用名称self代替。

y.addtwice('cat')与执行Bag.addtwice(y, 'cat')相同。因此,addtwice实际上正在执行y.add('cat')两次,这与执行Bag.add(y, 'cat')两次相同。所以addtwice实际上正在做y.data.append('cat')两次。

每个实例方法中的self 只是一个自动添加的变量,指向它所调用的实例,在本例中为y

答案 3 :(得分:1)

让我们看看Bag类中的函数add(self, x)

当调用该函数时,其中一个参数是self,它是对象本身,在这种情况下,是调用Bag函数的add的同一个实例。

因此,在函数add中,调用self.data.append(x)基本上是在data Bag列表中调用函数追加,因此,将元素x添加到列表。

函数addtwice也是如此。通过两次调用函数add,将两个元素添加到Bag的data列表中。

两个函数都返回data列表。

答案 4 :(得分:1)

add(self, x)只是您要调用的函数。

append是一个内置函数,可以向列表中添加元素。

所以你的add函数基本上使用append将你想要的元素添加到列表中并返回你命名为data的列表

self.addtwice会将self.add调用两次,因此会将元素添加两次。