为什么在Python中使用[].append()没有效果?

8
为什么这个能够运作 -
a = []
a.append(4)
print a

但这并不意味着 -
print [].append(4)

第二种情况的输出是None。你可以解释一下这个输出吗?

2
如果您执行 print a.append(4),您将得到 None。 - Robin Manoli
2
哇!Python社区速度飞快,而且非常乐于助人。 :-) 谢谢大家。 - Kshitiz Sharma
3个回答

12

append方法没有返回值。它在原地修改列表,由于您没有将[]赋值给任何变量,因此它只是“消失了”。

class FluentList(list):
    def append(self, value):
        super(FluentList,self).append(value)
        return self

    def extend(self, iterable):
        super(FluentList,self).extend(iterable)
        return self

    def remove(self, value):
        super(FluentList,self).remove(value)
        return self

    def insert(self, index, value):
        super(FluentList,self).insert(index, value)
        return self 

    def reverse(self):
        super(FluentList,self).reverse()
        return self

    def sort(self, cmp=None, key=None, reverse=False):
        super(FluentList,self).sort(cmp, key, reverse)
        return self

li = FluentList()
li.extend([1,4,6]).remove(4).append(7).insert(1,10).reverse().sort(key=lambda x:x%2)
print li

我没有重载所有相关方法,但概念应该是清楚的。


1
不,a 是可变的,它的值已经被改变了,没有什么需要返回的。 - adarsh
1
@KshitizSharma 如果你需要的话,可以选择使用[] + [4]而不是append。请注意,这将创建一个新对象。 - Jonas Schäfer
3
@KshitizSharma 没错,这不是“函数式风格”,而不是因为它返回 None,而是因为它直接就地修改了对象。返回空值使得它不太可能被误认为是一个返回新对象的“函数式风格”方法,这将导致别名错误。请注意,每次修改列表时都复制一次列表会非常低效。list 像一个持久化数据结构并不好用,有更好的替代品。 - user395760
@delnan 但是,如果它在原地修改后仍然返回对象,它就可以支持Java风格的方法链,并使代码更短。这是过时/不好的做法吗? - Kshitiz Sharma
list.append() 返回 None,这样如果你假设正在复制列表,则会“快速失败”。最好捕获意外的 None 结果,而不是在完全没有预料到的情况下处理指向同一对象的两个变量! - kindall
显示剩余8条评论

1

append 返回 None

从你的例子中:

>>> print a.append(4)
None

1

append 方法没有返回值,换句话说,它只会返回 None

a 是可变的,它的值被改变了,因此没有什么需要返回的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接