Python 为什么修改list()返回的内容不起作用?
假设我有一个包含三个字符串的列表,我想要一个删除其中一个字符串的新列表。我知道有其他方法可以做到这一点,但我感到惊讶的是,以下方法不起作用:Python 为什么修改list()返回的内容不起作用?,python,list,Python,List,假设我有一个包含三个字符串的列表,我想要一个删除其中一个字符串的新列表。我知道有其他方法可以做到这一点,但我感到惊讶的是,以下方法不起作用: x = ['A','B','C'] y = list(x).remove('A') 为什么上述方法不起作用 编辑:谢谢大家的回答 Per(增加强调): 某些操作(例如y.append(10)和y.sort())会改变对象,而表面上类似的操作(例如y=y+[10]和sorted(y))会创建一个新对象一般来说,在Python中(以及在标准库中的所有情况下
x = ['A','B','C']
y = list(x).remove('A')
为什么上述方法不起作用
编辑:谢谢大家的回答 Per(增加强调):
某些操作(例如y.append(10)
和y.sort()
)会改变对象,而表面上类似的操作(例如y=y+[10]
和sorted(y)
)会创建一个新对象一般来说,在Python中(以及在标准库中的所有情况下),对对象进行变异的方法将返回None
,以帮助避免混淆这两种类型的操作。因此,如果您错误地编写了y.sort()
,认为它会给您一个y
的排序副本,相反,您将得到None
,这可能会导致您的程序生成一个易于诊断的错误
由于remove
是一种变异方法(更改列表
它被就地调用),因此它遵循返回None
的一般模式。如果没有,那么一行如下:
y = x.remove('A')
这似乎是可行的,但它会将y
化名为x
引用的同一列表
,根本不会创建新的列表
,并且可能需要一些时间才能注意到该错误,即使您使用x
和y
相信它们是独立的。通过返回None
,任何试图使用y
并认为它是一个单独的list
(或者根本就是一个list
)的尝试都可能会失败(在您的情况下,无论是否使用list
包装,都会使您对remove
的滥用变得明显)
这通常也鼓励Python的(松散的)指导方针避免将流程中的太多步骤推到一行上。如果要复制列表
并删除一个元素,可分两步执行:
y = list(x)
y.remove('A')
它工作得很好。我想这取决于你认为它“工作”的意思。
x.remove('A')
应该工作<代码>列表(x)。删除('A')创建一个新列表,并从新创建的列表中删除A
。因此,即使在删除元素后打印x
,A
仍将存在。list.remove()
返回None
。它被记录为这样做,这是故意的。