gpt4 book ai didi

python - 列表值在应保持不变的地方发生变化

转载 作者:行者123 更新时间:2023-11-30 22:58:32 24 4
gpt4 key购买 nike

我之前在玩一些代码,我注意到一些很奇怪的东西,但我无法解释它。

下面两个函数除了一件事之外完全相同。变量origionalPos在第一个函数中是一个列表,在第二个函数中是一个元组。

def ticking_as_list():
tick = False
ticking = False
originalPos = [0,0]
pos = [0,0]

x = 0
RUNNING = True
while RUNNING:
x += 1
if x % 50 == 0:
tick = not tick
ticking = not ticking

if ticking:
originalPos = pos
ticking = False

pos[0] = originalPos[0] + 10
pos[1] = originalPos[1] + 10

if x == 500:
RUNNING = False
print(pos)

def ticking_as_tuple():
tick = False
ticking = False
originalPos = (0,0)
pos = [0,0]

x = 0
RUNNING = True
while RUNNING:
x += 1
if x % 50 == 0:
tick = not tick
ticking = not ticking

if ticking:
originalPos = (pos[0],pos[1])
ticking = False

pos[0] = originalPos[0] + 10
pos[1] = originalPos[1] + 10

if x == 500:
RUNNING = False
print(pos)

这些函数设置为更改 pos 的值,并在每次 x 被 50 整除时将其加 10,并在等于 500 时打印结果。有我知道更简单的方法,但这不是问题的主题。

当我运行这两个函数中的任何一个时,我期望从它们两个中获得 [110,110] 的输出;当我实际运行它们时,输出如下:

>>> ticking_as_list()
[4520,4520]
>>> ticking_as_tuple()
[110,110]

ticking作为列表时的功能显然比作为元组时要高得多。当我通过在每个函数执行时打印 pos 来查看每个函数执行时发生的情况时,它显示每次迭代时都会将 10 添加到 pos 中,而仅在每 50 次迭代之后当它是一个元组时,它应该是。

为什么即使值 ticking 等于 false,列表也总是更新?如代码所示:

        if x % 50 == 0:
tick = not tick
ticking = not ticking

if ticking:
originalPos = pos
ticking = False

ticking 仅当 x 能被 50 整除时才变为 true,之后立即变为 false。然而,这应该使 originalPos 仅在这是真的时更新;事实并非如此。不过,它作为元组值确实可以正常工作。为什么是这样?如果我不小心更改了其他地方的值,元组函数中就会出现错误,因为元组是静态的,如果函数其他部分的逻辑关闭,元组函数将输出与列表函数相同的输出.

出现这种情况的原因是什么?

最佳答案

originalPos = pos不会创建新列表,它只是为现有列表提供一个新名称。要创建新列表,您可以使用空 list slice .

originalPos = pos[:]

编辑:它看起来像一个明确的 copy Python 3.3 中添加了该方法。

originalPos = pos.copy()

关于python - 列表值在应保持不变的地方发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36136873/

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