【问题标题】:One of my lists shouldn't change, but it does我的清单之一不应该改变,但它确实
【发布时间】:2013-08-05 04:25:04
【问题描述】:

所以我有一个函数:

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)

stack突然变成[0] 有谁知道为什么?第二段代码中的flip_pancakes()函数应该只改变了difStack吧?

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

谢谢!

【问题讨论】:

    标签: list python-3.x


    【解决方案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】:

    difstack 列表不是新列表。

    改变这个:

    difStack = stack
    

    到这里:

     difStack = stack[:]
    

    【讨论】:

      【解决方案3】:

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

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

      difStack = stack[:]
      

      或将其传递给list() 内置函数:

      difStack = list(stack)
      

      【讨论】:

      • 好的,谢谢,我明白了,但为什么堆栈变为 0?我没有将 difStack 更改为 0...是吗?
      • @user2540878:你在函数中调用stack.remove
      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多