List 我的一份清单应该是';我不能改变,但它确实改变了

List 我的一份清单应该是';我不能改变,但它确实改变了,list,python-3.x,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()

所以我有一个函数:

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)
给定

这大部分是有效的。它在正确的位置翻转堆栈

但是,当我稍后使用时:

difStack = stack
flip_pancakes(difStack, difStack.index(max(difStack)) + 1) # flip stack so largest number is at front
print(stack)
堆栈突然变为[0] 有人知道为什么吗?代码第二位中的flip_pancakes()函数应该只更改了difStack,对吗

我意识到这一点真的很混乱;有什么办法可以改进吗


谢谢

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

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

difStack = stack[:]
或者将其传递到
列表()
内置:

difStack = list(stack)
difstack列表不是一个新列表

更改此项:

difStack = stack
为此:

 difStack = stack[:]

其他答案正确地指出了问题所在,即您正在修改传递到函数中的列表。然而,我认为他们提出的解决方案并不理想

不要复制列表的一部分,然后循环删除一些值,只需执行一对切片并连接:

def flip_stack(stack, nFlip):
    return stack[nFlip-1::-1] + stack[nFlip:]
这根本不会修改堆栈。第一个切片有一个负的“步长”项,因此它颠倒了值的顺序

如果您确实希望翻转发生在适当的位置,而不是为新的顺序创建新的列表,那么您可以执行切片分配,而不是通过连接两个切片来形成新的列表。我是这样做的:

def flip_stack_inplace(stack, nFlip):
    stack[:nFlip] = stack[nFlip-1::-1]
这个版本没有显式返回任何内容(这意味着它实际上返回
None
,因为这是Python的默认返回值)。所有更改都直接在
堆栈
列表中完成

用法示例:

>>> 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]

好的,谢谢,我明白了,但是为什么堆栈变为0?我没有将difStack更改为0。。。是吗?@user2540878:您调用了
堆栈。在函数中删除
。是的,我确实希望直接更改堆栈,但我不知道这是否可行。谢谢
>>> 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]