【问题标题】:How does array assignment work within a python function?数组赋值如何在 python 函数中工作?
【发布时间】: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 sitemergeSort 代码能够重新分配外部定义的列表。最初认为mergeSort 代码中的alist 应该是一个局部变量。

【问题讨论】:

  • arr 是一个局部变量。当您分配它时,它不再包含对原始列表的引用。
  • 可以使用切片赋值来更新列表:arr[:] = [2*x for x in arr]
  • 还有a != arra[0] 只是改变一个对象的状态,这与重新分配完全不同,它采用 a 并将其指向一个完全不同的、新分配的列表。调用范围内的原始变量不会受到这种重新分配的影响。
  • 啊抱歉,works1works2 都有错字:之前的 a 实例应该是 arr 的。但是@Barmar,是的,没错,我实际上很困惑为什么works1works2 函数完成了我想要的,因为我认为它们只是将值分配给局部变量。我现在看到,由于在这两种情况下我都没有真正初始化arr,所以它们不能创建一个名为arr 的新局部变量,这与fails1 不同。
  • @ggorlen 谢谢,这只是我的一个错字。在works1works2 中有a 的地方应该有arr。但我想我现在明白了:你能告诉我我上面的评论是否正确吗?

标签: python python-3.x list assignment-operator


【解决方案1】:

arr 是对列表对象的引用

当您编写arr[0]=1 时,您会更改此引用对象中的元素。 但是当你写arr=[..new list..]你只是让arr引用一个新的对象,它不会影响以前的对象。

【讨论】:

  • 酷,是的,这就是我从上面的 cmets 中了解到的,谢谢。我最初认为在函数中包含arr[0]=1 也会将arr 初始化为局部变量,但我现在发现这是不正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多