Skip to main content
 首页 » 编程设计

python之我不能更改函数内的列表吗

2025年05月04日20fff_TT

# 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 上的文档.