为什么这不返回给定数字的旋转?
我来举个例子,解释一下我想做的事情:
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))
这个小改动应该能解决问题!;-)