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]