0

您能否澄清一下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']
4

5 回答 5

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是。

于 2011-08-11T02:49:45.713 回答
1

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

于 2011-08-11T02:46:57.633 回答
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')两次。

selfin each instance 方法只是一个自动添加的变量,指向它被调用的实例,在这种情况下是y.

于 2011-08-11T02:51:13.487 回答
1

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

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

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

功能也一样addtwice。通过两次调用函数add,将两个元素添加到dataBag 列表中。

这两个函数都返回data列表。

于 2011-08-11T02:51:52.053 回答
1

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

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

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

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

于 2011-08-11T02:52:24.217 回答