所以问题很奇怪。我编写了一个算法来将任何列表(数组)的内容移动到左边的给定位数。
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]
在控制台中。哪个是疯了,完全错了。那是为什么?
答案 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列表的副本以保留原始值。然后,将正确的副本传递给函数,它应该可以正常运行。