【问题标题】:The unexpected behaviour of swapping in python list在 python 列表中交换的意外行为
【发布时间】:2018-07-05 19:58:31
【问题描述】:

在这里,我想借助索引交换给定列表中的 4 和 2,因此我编写了以下代码。

>>>arr = [4,3,1,2]
>>> arr[0] , arr[arr[0]-1] = arr[arr[0]-1] ,arr[0]
>>> arr
[2, 4, 1, 2]

如您所见,上面的代码给出了意外的输出。预期的输出是 [2,3,1,4]。

但是当我写作时

>>>arr = [4,3,1,2]
>>>index = arr[0] - 1
>>>arr[0] , arr[index] = arr[index] ,arr[0]
>>>arr
[2, 3, 1, 4]

输出符合预期。

这是为什么呢?

编辑: 是的,还有其他方法可以交换第一个和最后一个元素。我不得不选择这种方法,之后我遇到了这种异常行为。我还没有找到任何解释

【问题讨论】:

    标签: python-3.x swap


    【解决方案1】:
    arr[0], arr[-1] = arr[-1], arr[0]
    

    ?

    显然,两个元组都是从左到右并行计算的,并且 LHS 元组的第二个元素的计算是在更改为第一个元素之后排序的,因此将第一个元素分配给 LHS 元组甚至会导致不同的引用成为它的第二个元素。

    【讨论】:

    • 我知道这会起作用,但是当我以这种方式写 arr[arr[0]-1] 时,答案并不像预期的那样,因此我很好奇为什么会这样。查了一会儿,没有解释。
    • 显然,两个元组都是从左到右并行求值的,LHS元组的第二个元素的求值是在更改为第一个元素之后排序的,因此将第一个元素分配给LHS元组甚至导致不同的引用成为第二个元素。
    • 当您使用arr[0] , arr[arr[0]-1] = arr[arr[0]-1] ,arr[0] 时,左侧的arr[arr[0]-1] 会在 arr[0] 发生更改后进行评估,因此您会得到2-1 而不是@987654326 @.
    • 是的,这个解释很有道理。感谢您的帮助
    【解决方案2】:

    Python 中的后向索引应为-num

    >>> arr = [4,3,1,2]
    >>> arr[0] , arr[-1] = arr[-1] ,arr[0]
    >>> arr
    [2, 3, 1, 4]
    

    【讨论】:

    • 我知道这会起作用,但是当我以这种方式写作时,答案并不像预期的那样,因此让我很好奇为什么会发生这种情况。查了一会儿,没有解释。
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2017-12-05
    • 2020-10-05
    • 2022-12-06
    • 2021-12-12
    • 2022-11-03
    相关资源
    最近更新 更多