首页 > 解决方案 > 使用嵌套列表索引时 Pythonic 交换导致索引错误

问题描述

我知道pythonic交换可以写成:

a,b = b,a
list[a], list[b] = list[b], list[a]

但在我的问题中,我想交换列表中的元素,但我使用的索引是原始列表中某个索引位置的值。它是这样工作的:

假设我有一个要交换的列表 nums,并且我有一个索引 i。

nums = [-10,-3,-100,-1000,-239,1]  # list to swap
i = 5  # index

在这里我们可以假设

if nums[i] > 0 and nums[i]<=len(nums)

交换后我期望的是:

[1, -3, -100, -1000, -239, -10]

以下命令给我索引超出范围错误:

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]   # gives list assignment out of range error

虽然以下命令工作正常:

t = nums[i]
nums[i] = nums[t-1]
nums[t-1] = t

我很困惑,请让我知道我错在哪里。

标签: pythonlistswap

解决方案


这是因为在 Python 中交换两个变量是如何工作的。

注意即使你得到一个AssignmentError, 如果你之后打印出你的列表,你有

>>> nums
[-10, -3, -100, -1000, -239, -10]

这是因为作为在右侧创建的元组

nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]

解包并分配到左侧,在解包期间评估左侧。

所以

  • RHS 元组是用值创建的(-10, 1)
  • nums[i]被指定为 -10
  • 然后您尝试分配nums[nums[i]-1]1... 但由于此时nums[i]已评估并且现在为-10,因此您的索引现在将为-11,从而给出错误。

推荐阅读