问题是通过将数字从右侧移动k次来旋转列表。e、 k=3的g.[1,2,3,4,5,6,7]将从右一次旋转数字,并将其移动到列表顶部,以便输出为[5,6,7,1,2,3,4]。我没有在列表中使用pop和insert操作,而是决定在python中使用支持在O(1)中添加到列表左侧的dequue数据类型。然而,我不太确定从出列到列表的转换是如何发生的。第二个函数起作用,而第一个函数不起作用。如果你能解释原因,我将不胜感激
from collections import deque
def rotateNums(nums, k):
dq = deque(nums)
for _ in range(0,k):
num = dq.pop()
dq.appendleft(num)
nums = list(dq)
def rotateNums(nums, k):
dq = deque(nums)
for _ in range(0,k):
num = dq.pop()
dq.appendleft(num)
nums[:] = list(dq)
nums = [1,2,3,4,5,6,7]
k = 3
print(f'nums before rotation: {nums}')
rotateNums(nums, k)
print(f'nums after rotation: {nums}')
第一个函数的输出是:旋转后的nums:[1,2,3,4,5,6,7]
第二个函数的输出是:[5,6,7,1,2,3,4]
这是由于范围界定而发生的。在第一个函数中,使用以下代码
nums = list(dq)
将deque
的值赋值给nums
。这告诉python这个nums
是函数rotateNums
的局部变量。因此,它在外部nums
没有影响。相反,如果您这样做:输出将是:
而在第二种方法中,通过调用
nums[:] =
,您正在访问并修改nums
的元素,这是允许的,并且不会创建局部变量nums
问题不在从deque到list的对话中,您在这两种情况下都正确地使用
nums[:] = list(dq)
。它与第一个函数中的nums = list(dq)
行一起。这将在函数中本地将名称num
重新分配给不同的列表对象。后续的替换操作对本地对象进行操作,而不是对传入的列表进行操作另一方面,您不需要显式地将
dq
转换回列表来分配它。它已经是可编辑的,并且是一个序列,所以您可以很好地执行nums[:] = dq
相关问题 更多 >
编程相关推荐