我想做一个函数,循环列表中的元素,但它改变全局列表



函数循环删除列表的第一个元素,将其放在最后一个位置。我使用pop和append来做到这一点。问题是如果你使用:

l=[1,2,3]
assert(cycle(l)== [2,3,1])
assert(cycle(cycle(l))== [3,1,2])

它给你一个断言错误,所以我想也许列表是全局改变,但我不希望这样,我找不到解决方案。我是编程新手。

l=[1,2,3]
def cycle(y):
x=y.pop(0)
y.append(x)
return (y)
assert(cycle(l) == [2, 3, 1])
assert(cycle(cycle(l)) == [3, 1, 2])
assert(l == [1, 2, 3])

我尝试通过使用y的副本来重置函数中的列表来稍微改变我的代码,但似乎也不起作用。也许是我做错了。

l=[1,2,3]
def cycle(y):
z=y.copy
x=y.pop(0)
y.append(x)
return (y)
y=z
assert(cycle(l) == [2, 3, 1])
assert(cycle(cycle(l)) == [3, 1, 2])
assert(l == [1, 2, 3])

这是因为Python传递指向列表的指针,但不创建自己的副本。因此,您可以简单地使用:

from copy import deepcopy
cycle(deepcopy(l))

所以你的列表不会全局改变。

print(cycle(l))
print(cycle(cycle(l)))
print(l)
assert(cycle(l) == [2, 3, 1])
assert(cycle(cycle(l)) == [1, 2, 3])
assert l == [1, 2, 3]

我认为你需要更新第二个断言预期输出。cycle(l)call return[3,2,1],当你再次将此传递给cycle(cycle(1))时,它将返回[1,2,3]

使用deepcopy代替copy,并使用复制的对象

from copy import deepcopy
l=[1,2,3]
def cycle(y):
z=deepcopy(y)
x=z.pop(0)
z.append(x)
return (z)
assert(cycle(l) == [2, 3, 1])
assert(cycle(cycle(l)) == [3, 1, 2])
assert(l == [1, 2, 3])

最新更新