【发布时间】:2021-05-09 03:53:58
【问题描述】:
我对以下示例感到困惑。让a=[1] 成为一个python 列表,并尝试编写一个重新分配列表的函数,以便在运行该函数后我们将拥有a=[2]。
一个简单的函数是
def works1(arr):
arr[0]=2
或者另一个例子是
def works2(arr):
arr[0]=2*arr[0]
在运行works1(a) 或works2(a) 时执行我想要的操作:两者都设置a=[2]。
但是,像下面这样尝试一次重新分配整个数组,而不是逐个组件地分配,将会失败。
def fails1(arr):
arr=[2*x for x in arr]
运行fails1(a)不会重新分配a,它仍然由a=[1]给出。
有人可以解释这种行为或指出我应该在文档中的哪个位置了解上述内容吗?
编辑:对于上下文,如果有帮助,我试图理解为什么 this site 的 mergeSort 代码能够重新分配外部定义的列表。最初认为mergeSort 代码中的alist 应该是一个局部变量。
【问题讨论】:
-
arr是一个局部变量。当您分配它时,它不再包含对原始列表的引用。 -
可以使用切片赋值来更新列表:
arr[:] = [2*x for x in arr] -
还有
a != arr。a[0]只是改变一个对象的状态,这与重新分配完全不同,它采用a并将其指向一个完全不同的、新分配的列表。调用范围内的原始变量不会受到这种重新分配的影响。 -
啊抱歉,
works1和works2都有错字:之前的a实例应该是arr的。但是@Barmar,是的,没错,我实际上很困惑为什么works1和works2函数完成了我想要的,因为我认为它们只是将值分配给局部变量。我现在看到,由于在这两种情况下我都没有真正初始化arr,所以它们不能创建一个名为arr的新局部变量,这与fails1不同。 -
@ggorlen 谢谢,这只是我的一个错字。在
works1和works2中有a的地方应该有arr。但我想我现在明白了:你能告诉我我上面的评论是否正确吗?
标签: python python-3.x list assignment-operator