我的一个列表不应该改变,但确实如此

时间:2013-08-05 04:25:04

标签: list python-3.x

所以我有一个功能:

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

我意识到那一点特别麻烦;有什么方法可以改善吗?

谢谢!

3 个答案:

答案 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)