所以我有一个功能:
def flip_stack(stack, nFlip):
"""flip_stack(list, num)
Edits stack to flip the first nFlip elements in the stack."""
newStack = stack[:nFlip]
for element in newStack:
stack.remove(element)
newStack.reverse()
stack = newStack + stack
return(stack)
鉴于
stack = [2, 3, 1, 4, 0]
nFlip = 3
stack = [1, 3, 2, 4, 0]
这很有用。它会在正确的位置翻转堆栈。
然而,当我稍后使用它时:
difStack = stack
flip_pancakes(difStack, difStack.index(max(difStack)) + 1) # flip stack so largest number is at front
print(stack)
堆栈突然变成[0]
有谁知道为什么?第二位代码中的flip_pancakes()函数应该只更改了difStack,对吗?
我意识到那一点特别麻烦;有什么方法可以改善吗?
谢谢!
答案 0 :(得分:1)
difstack 列表不是新列表。
改变这个:
difStack = stack
对此:
difStack = stack[:]
答案 1 :(得分:1)
其他答案已正确识别问题,即您正在修改传递给函数的列表。但是,我认为他们建议的解决方案并不理想。
不是复制部分列表,而是循环去除一些值,只需做一对切片并连接:
def flip_stack(stack, nFlip):
return stack[nFlip-1::-1] + stack[nFlip:]
这根本不会修改stack
。第一个切片具有负“步”项,因此它会反转值的顺序。
如果您确实希望在适当的位置进行翻转,而不是为新排序创建新列表,则可以执行切片分配,而不是通过连接两个切片来形成新列表。我就是这样做的:
def flip_stack_inplace(stack, nFlip):
stack[:nFlip] = stack[nFlip-1::-1]
此版本未显式返回任何内容(这意味着它实际返回None
,因为这是Python的默认返回值)。所有更改都直接在stack
列表中完成。
使用示例:
>>> s = [1, 2, 3, 4, 5]
>>> print(flip_stack(s, 3))
[3, 2, 1, 4, 5]
>>> print(s)
[1, 2, 3, 4, 5]
>>> flip_stack_inplace(s, 3)
>>> print(s)
[3, 2, 1, 4, 5]
答案 2 :(得分:0)
difStack = stack
不会克隆stack
。这两个变量仍然指向同一个列表对象。
如果要克隆列表,请将其切片:
difStack = stack[:]
或者将其传递给list()
内置:
difStack = list(stack)