2014-12-05 150 views
3

我和我的翻译工作,找出了Python append()方法的行为,结果发现:因为我觉得这让我为难,意外行为list.append

In [335]: b = [].append(1) 

In [336]: b 

In [337]: 

In [337]: b = [].append('1') 

In [338]: b 

,每当我们称之为append()名单上,我们添加新对象到其结束,所以不应该对空列表调用append()(如我上面所说的那样)给我同样的结果,我可以有实现:

In [339]: b=[] 

In [340]: b.append(1) 

In [341]: b 
Out[341]: [1] 

我可能有一种误解,在这里,所以请更正我如果我错了。

回答

5

,因为我认为只要我们一 名单上调用append(),我们添加新对象到其结束

这是正确的这令我费解。但是你忘记的是append()(就像大多数变异对象的方法)总是在Python中返回None,因为它在原地运行。那么,这样做:

b = [].append(1) 

是一样的:

b = None 

1在技术上添加到列表[],但没有办法调用append()后访问,因为b是这个名单分配给方法调用的返回值。

第二个例子工作正常,只是因为你没有重新分配b,从而失去了对列表对象的引用。

+0

哦对。嗯,有没有什么理由说'apppend()'返回'None'是好的?是因为,就像在第二个例子中,当我做了'b.append()',如果append()'没有返回'None',那么它会修改'b'的类型并改变它的值?因为现在看来,如果'append()'总是返回'None',那么在'b'上调用'append()'也会导致'b'的值更改为'None',即使在第二个例。我的误解是什么? – AKKO 2014-12-05 03:47:05

+0

我相信它的基本原理是它强制简单和明确。你必须一次做一件事,避免大量的意大利面陈述和副作用。 – tripleee 2014-12-05 04:29:29

+0

@AKKO - 那你必须向Python核心开发者询问为什么'append()'返回'None'的确切原因。这只是一个设计决定。我猜想是这样,你不能把这个电话埋在另一条线内。由于'append()'改变了列表,它应该在它自己的路线上引起注意。事实上,几乎所有在Python中改变对象的方法都遵循这个约定并返回None。 – iCodez 2014-12-05 15:54:25

2

append是一种不返回任何内容的方法。所以调用ls.append(1)将在ls的末尾附加1,但ls.append(1)没有实际价值。因此设置b = [].append('1')b设置为None