代码之家  ›  专栏  ›  技术社区  ›  Psyduck

使用嵌套列表索引时,pythonic交换导致索引错误

  •  2
  • Psyduck  · 技术社区  · 6 年前

    我知道蟒蛇交换可以写成:

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

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

    假设我有一个要交换的列表num,并且我有一个索引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
    

    我很困惑,请告诉我哪里错了。

    1 回复  |  直到 6 年前
        1
  •  2
  •   miradulo    6 年前

    这是因为在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 …但是自从 核[一] 被评估 在这一点上 现在是-10,你的索引现在是-11,给出了错误。