为什么这不返回给定数字的旋转?

1 投票
6 回答
1240 浏览
提问于 2025-04-17 08:04

我来举个例子,解释一下我想做的事情:

Number = ["1","9","7"]  

所以我希望它返回:

[["1","9","7"],["9","7","1"],["7","1","9"]]  

但我得到的是:

[["7","1","9"],["7","1","9"],["7","1","9"]]

不知道为什么,它把我的第一个结果替换成了最后一个结果。

def Get_Rotations(Number):
    Rotations = []
    x = 0
    while x < len(Number):
        Number.insert(0,Number.pop())
        Rotations.append(Number)
        x += 1
    print(Rotations)
    return Rotations  

6 个回答

2

当你执行 Rotations.append(Number) 时,其实并不是在复制 Number,而是把对 Number 的引用添加到了 Rotations 中。这样一来,Rotations 中的三个索引都指向同一个对象(就像 Rotations = [Number, Number, Number] 这样),所以如果你改变了 Number,那么 Rotations 中的三个值都会受到影响。

相反,你应该创建一个新的数组,把 Number 的内容填进去,然后再把这个新数组添加到 Rotations 中。

3

我想推荐一个完全不同的解决方案。

from collections import deque

number = ['1', '9', '7']

rotator = deque(number)
rotations = [number]

for _i in range(len(number) - 1):
    rotator.rotate()
    rotations += [list(rotator)]

print(rotations)

请注意,这个方案效率更高。

另外,你可能希望在这个代码块运行后,rotator保持初始状态。你可以把代码改成下面这样

from collections import deque

number = ['1', '9', '7']

rotator = deque(number)
rotations = []

for _i in range(len(number)):
    rotations += [list(rotator)]
    rotator.rotate()

print(rotations)

现在,rotator会保持在初始的number状态。这个代码稍微容易理解一些,但在for循环中多了一次循环。

4

你需要创建Number的副本。在每次循环中,你都在操作同一个列表,然后把这个列表添加到Rotations里三次。所以你会看到Number在最后的状态出现了三次。

Rotations.append(list(Number))

这个小改动应该能解决问题!;-)

撰写回答