为什么修改list()返回不起作用?

时间:2018-02-09 01:11:18

标签: python list

假设我有一个包含三个字符串的列表,我想要一个删除其中一个字符串的新列表。我知道有其他方法可以做到这一点,但我很惊讶以下不起作用:

x = ['A','B','C']

y = list(x).remove('A')

为什么以上不起作用?

编辑:感谢大家的答案!

1 个答案:

答案 0 :(得分:2)

Per the Python Programming FAQ(强调补充):

  

某些操作(例如y.append(10)y.sort())会改变对象,而表面上类似的操作(例如y = y + [10]sorted(y))会创建一个新对象。 一般来说,在Python中(在所有情况下都在标准库中),一个改变对象的方法将返回None,以帮助避免让两种类型的操作混淆。所以如果你错误地写y.sort()认为它会为您提供y的已排序副本,但最终会以None结尾,这可能会导致您的程序生成一个容易被诊断出来的错误。

由于remove是一种变异方法(更改了就地调用的list),因此它遵循返回None的一般模式。如果没有,那就像:

y = x.remove('A')

似乎可行,但它会ylist引用的x进行别名,而不会创建新的list,而且可能需要有一段时间可以注意到这个错误,即使你使用xy相信它们是独立的。通过返回None,任何使用y认为它是单独的list(或者list)的尝试都可能会大声失败(就像在你的案件,无论有没有list包装,都会使您误用remove

这通常也会鼓励Python(松散)指南避免在一行中推动过多的步骤。如果要复制list并删除一个元素,可以分两步完成:

y = list(x)
y.remove('A')

它运作得很好。