假设我有一个包含三个字符串的列表,我想要一个删除其中一个字符串的新列表。我知道有其他方法可以做到这一点,但我很惊讶以下不起作用:
x = ['A','B','C']
y = list(x).remove('A')
为什么以上不起作用?
编辑:感谢大家的答案!
答案 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')
似乎可行,但它会y
对list
引用的x
进行别名,而不会创建新的list
,而且可能需要有一段时间可以注意到这个错误,即使你使用x
和y
相信它们是独立的。通过返回None
,任何使用y
认为它是单独的list
(或者list
)的尝试都可能会大声失败(就像在你的案件,无论有没有list
包装,都会使您误用remove
。
这通常也会鼓励Python(松散)指南避免在一行中推动过多的步骤。如果要复制list
并删除一个元素,可以分两步完成:
y = list(x)
y.remove('A')
它运作得很好。