gpt4 book ai didi

python - 在多重赋值的退化情况下会发生什么?

转载 作者:太空狗 更新时间:2023-10-29 17:00:42 25 4
gpt4 key购买 nike

我是 teaching myself algorithms .我需要交换列表中的两个项目。 Python 让一切变得简单:

def swap(A, i, j):
A[i], A[j] = A[j], A[i]

这是一种享受:

>>> A = list(range(5))
>>> A
[0, 1, 2, 3, 4]
>>> swap(A, 0, 1)
>>> A
[1, 0, 2, 3, 4]

请注意,该函数对退化情况 i = j 具有弹性。如您所料,它只是让列表保持不变:

>>> A = list(range(5))
>>> swap(A, 0, 0)
>>> A
[0, 1, 2, 3, 4]

后来我想排列列表中的三个项目。我写了一个函数来在 3 个循环中排列它们:

def cycle(A, i, j, k):
A[i], A[j], A[k] = A[j], A[k], A[i]

这很有效:

>>> A = list("tap")
>>> A
['t', 'a', 'p']
>>> cycle(A, 0, 1, 2)
>>> A
['a', 'p', 't']

但是我(最终)发现它在退化的情况下会出错。我假设一个退化的 3 循环将是一个交换。所以当i = j时,cycle(i, i, k) ≡ swap(i, k):

>>> A = list(range(5))
>>> cycle(A, 0, 0, 1)
>>> A
[1, 0, 2, 3, 4]

但是当 i = k 时会发生其他事情:

>>> A = list(range(5))
>>> sum(A)
10
>>> cycle(A, 1, 0, 1)
>>> A
[1, 1, 2, 3, 4]
>>> sum(A)
11

这是怎么回事? sum 在任何排列下都应该是不变的!为什么这种情况 i = k 会以不同方式退化?

我怎样才能达到我想要的?这是一个 3 循环函数,如果只有 2 个索引不同 cycle(i, i, j) ≡ cycle(i, j, i) ≡ cycle(i, j, j) ≡ swap( i, j)

最佳答案

cycle 完全按照您的要求进行操作:将左侧值分配给右侧值。

def cycle(A, i, j, k):
A[i], A[j], A[k] = A[j], A[k], A[i]

在功能上等同于

def cycle(A, i, j, k):
new_values = A[j], A[k], A[i]
A[i], A[j], A[k] = new_values

所以当你执行 cycle(A, 1, 0, 1) 时,你就是在说你想要

A[1] = previous_A[0]
A[0] = previous_A[1]
A[1] = previous_A[1]

如果你想让循环按顺序工作,那么你必须按顺序编写它,否则 python 会评估右手,然后将其扩展到左手的参数。

关于python - 在多重赋值的退化情况下会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com