函数循环删除列表的第一个元素,将其放在最后一个位置。我使用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])