【问题标题】:Strange results when swapping items in Python list在 Python 列表中交换项目时出现奇怪的结果
【发布时间】:2021-03-23 12:19:55
【问题描述】:

当我尝试交换列表中的 2 个项目时,会发生一些奇怪的事情。尝试此代码时,nums 更新为[4, 1, 3, 1]

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

但是,当命令是

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

数字是[-1, 1, 3, 4],这是我所期望的。

我对这两种情况会发生什么感到完全困惑。谁能解释清楚?

【问题讨论】:

    标签: python list


    【解决方案1】:

    您尝试做的是在 Python 中称为多重赋值。 考虑以下代码:

    [print(0)][0], [print(1)][0] = print(2), print(3)
    

    输出:

    2
    3
    0
    1
    
    [print(0)][0] = [print(1)][0] = [print(2)][0] = [print(3)][0]
    

    输出:

    3
    0
    1
    2
    

    您可能已经发现,对于这些赋值中的任何一个,右手操作数首先从左到右求值,然后与左操作数一起计算。

    它在您提供的代码中的工作方式相同。

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

    在右侧,nums[nums[i]-1] 被计算为 nums[3],得到整数 1,然后nums[i] 被计算为 nums[1],得到整数 4。

    现在轮到为左侧操作数赋值了。目前,nums[i] 指代nums[1],因此1 被分配给nums[1]。注意nums[1]现在等于1,然后解释器发现nums[nums[i]-1]指的是nums[1-1],也就是nums[0]!然后将4 分配给nums[0],给你结果[4, 1, 3 ,1]

    但是,如果切换操作数,这个多重赋值的顺序会改变,结果也会不同。同样,评估过程如下:

    nums: [-1, 4, 3, 1]
    nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
    
    nums: [-1, 4, 3, 1]
    nums[nums[i]-1], nums[i] = 4, nums[nums[i]-1]
    
    nums: [-1, 4, 3, 1]
    nums[nums[i]-1], nums[i] = 4, 1
    
    nums: [-1, 4, 3, 1]
    nums[3], nums[i] = 4, 1
    
    nums: [-1, 4, 3, 4]
    nums[i] = 1
    
    nums: [-1, 1, 3, 4]
    

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多