# left rotate using slicing
def leftRotate(arr, k, n):
arr = arr[k:] + arr[:k]
print(arr)
arr = [1, 2, 3, 4, 5, 6, 7]
leftRotate(arr, 2, 7)
print(arr)
结果:
[3, 4, 5, 6, 7, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
当我在函数外打印数组时,它不再旋转并保持原来的样子。有人可以帮助我理解这一点吗?
请您参考如下方法:
是的,您可以在函数内更改列表,但您需要使用正确的语法。正如您已经看到的,这不是正确的方法:
def leftRotate(arr, k, n):
arr = arr[k:] + arr[:k]
我将尝试解释为什么这不起作用,并希望能让您更好地了解实际情况。在上面显示的函数范围内,有 3 个局部变量:arr、k 和 n。右侧操作 arr[k:] + arr[:k] 创建一个新的列表对象,而不修改原始列表,并将此结果对象绑定(bind)到局部变量名 到达。这不会修改原始对象,因为 Python 中的此类赋值语句从不改变对象。它们只会绑定(bind) namespace 中的名称。 把它想象成您正在从作为参数传入的旧列表对象上取下名称标签“arr”,并将其粘贴到新列表对象上这是刚刚创建的。旧列表对象不会被这样的操作修改,只会修改本地命名空间 - 旧列表对象变为“匿名”并且在此范围内不再可访问。
解决方案是使用一种不同类型的赋值语句,切片赋值,它会发生变异:
def leftRotate(arr, k, n):
arr[:] = arr[k:] + arr[:k]
最后要注意的是,stdlib 中有一个类似列表的数据结构,它提供了更高效的旋转操作(以索引到集合中间的效率较低为代价)。如果您对此感兴趣,请阅读 collections.deque 上的文档.
