功能通常单独工作,但在多次调用时无法正常工作。蟒蛇

时间:2016-12-29 14:47:54

标签: python

所以问题很奇怪。我编写了一个算法来将任何列表(数组)的内容移动到左边的给定位数。

DIGS = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

# move functions
def move(arr):
    this = arr
    first = this[0]
    for b in range(len(this) - 1):
        this[b] = this[b + 1]
    this[-1] = first
    return this

def move_with_step(arr, step):
    this_arr = arr
    for a in range(step):
        this_arr = move(arr)
    return this_arr

而且,显然,当键入print(move_with_step(DIGS, 5)时会给我们相同的DIGS数组但是会扭曲。这将是[5,6,7 ... 3,4]。你明白了。在这种情况下,它的工作原理。但是...

  

问题是:如果我将这个相同的调用放入for循环中,如下面或者一个接一个,它会给我错误的结果,这有点奇怪,因为它不应该修改DIGS本身和为什么会发生IDK。

所以这段代码

for a in range(1, 6):
    print(move_with_step(DIGS, a))

返回此

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
[6, 7, 8, 9, 0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]

在控制台中。哪个是疯了,完全错了。那是为什么?

2 个答案:

答案 0 :(得分:3)

问题是DIGS在每个循环中都会发生变化。所以当你这样做时:

for a in range(1, 6):
    print(move_with_step(DIGS, a))

在第一个循环结束时DIGS=[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]。因此,在第二个循环中,它将从DIGS已经更改开始。

@depperm在评论中提到的一个简单的解决方案是传递列表的副本:

for a in range(1, 6):
    print(move_with_step(DIGS[:], a))

<强>输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[2, 3, 4, 5, 6, 7, 8, 9, 0, 1]
[3, 4, 5, 6, 7, 8, 9, 0, 1, 2]
[4, 5, 6, 7, 8, 9, 0, 1, 2, 3]
[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]

答案 1 :(得分:0)

您应该创建DIGS列表的副本以保留原始值。然后,将正确的副本传递给函数,它应该可以正常运行。

查看How to clone or copy a list?