0

所以我有一个功能:

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,对吧?

而且我意识到那个特定的部分真的很混乱。有什么办法可以改善吗?

谢谢!

4

3 回答 3

1

diffstack列表不是一个新列表。

改变这个:

difStack = stack

对此:

 difStack = stack[:]
于 2013-08-05T04:27:49.027 回答
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]
于 2013-08-05T04:45:17.327 回答
0

difStack = stack不克隆stack。这两个变量仍然指向同一个列表对象。

如果要克隆列表,请将其切片:

difStack = stack[:]

或将其传递到list()内置:

difStack = list(stack)
于 2013-08-05T04:27:33.810 回答