您能否澄清下面的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']
答案 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调用两次,因此会将元素添加两次。