如果您在寻求帮助修复代码后被发送到这里:
以后, 请尝试 自己查找代码中的问题, 仔细研究 代码运行时发生的情况。不要因为出现错误消息而放弃,而是检查每次计算的结果,看看代码在哪里开始工作与你的预期不同。
如果你的代码中有一个方法调用,比如 .append
列表上的 .sort
或 返回值 是 None
,而列表被修改 了 。仔细研究这个例子:
>>> x = ['e', 'x', 'a', 'm', 'p', 'l', 'e']
>>> y = x.sort()
>>> print(y)
None
>>> print(x)
['a', 'e', 'e', 'l', 'm', 'p', 'x']
y
得到了特殊 None
值,因为这就是返回的值。 x
已更改,因为排序已在原处进行。
它故意这样工作,这样代码就会 x.sort().reverse()
中断。请参阅其他答案以了解 Python 开发人员为何希望这样做。
解决问题
首先,仔细思考一下代码的意图。x Should x
change? 我们真的需要一个单独的 吗 y
?
我们先考虑 .sort
一下。如果 x
应该改变,则 x.sort()
自行调用,而不将结果分配到任何地方。
如果 需要已 副本 y = x.sorted()
。 有关详细信息, 如何获取列表的排序副本?
对于其他方法,我们可以像这样获得修改后的副本:
.clear
-> 这没有任何意义;列表的“清除副本”只是一个空列表。只需使用 y = []
.
.append
和 .extend
-> 可能最简单的方法是使用 +
运算符。要从列表添加多个元素 l
,请使用 y = x + l
而不是 .extend
。要添加单个元素, e
请先将其包装在列表中 : y = x + [e]
。 3.5 及更高版本中的另一种方法是使用解包: y = [*x, *l]
for .extend
, y = [*x, e]
for .append
。另请参阅 如何允许列表 append() 方法返回新列表 for .append
和 如何在 Python 中连接两个列表? for .extend
.
.reverse
-> 首先,考虑是否需要实际复制。内置函数 reversed
为您提供了一个 迭代器 ,可用于以相反的顺序循环元素。要进行实际复制,只需将该迭代器传递给 list
: y = list(reversed(x))
。 有关详细信息, 如何获取列表的反向副本(在 .reverse 后链接方法时避免使用单独的语句)?。
.remove
-> 找出将被删除的元素的索引(使用 .index
),然后使用切片查找该点之前和之后的元素并将它们放在一起。作为函数:
def without(a_list, value):
index = a_list.index(value)
return a_list[:index] + a_list[index+1:]
(我们可以进行 .pop
类似的翻译以制作修改后的副本,尽管实际上 .pop
返回的是列表中的一个元素。)
另请参阅 在 Python 中返回不包含特定元素的列表的快速方法 .
(如果您计划删除 多个 元素,强烈建议使用列表推导(或 filter
在迭代列表时从列表中删除项目 所需的 任何解决方法都要简单得多 自然 给出修改后的副本。)
当然,对于上述任何一种情况,我们也可以通过显式 复制 然后在副本上使用就地方法来制作修改后的副本。最优雅的方法取决于上下文和个人喜好。