Python 对象混淆

Python by-object confusion

重复编辑: 还有一个 question 被标记为相似,但它是不同的,因为它只讨论 .append 和完整列表实例化。我的问题是关于偏移赋值 (data[j]) 和迭代器(在第一个函数中使用)。


我对 Python 按对象信息传递有点困惑。在我的教科书中,当函数接收到它的参数时,它会为初始对象创建一个别名。另外,关于可变参数:"we note that reassigning a new value to a formal parameter, such as by setting list = [ ], does not alter the actual parameter; such reassignment breaks the alias".

现在我有这两个功能了:

def mult(data, factor):
    for val in data:
        val *= factor
data = [i for i in range(5)]
mult(data, 3)
print(data)

def mult2(data, factor):
    for j in range(len(data)):
        data[j] *= factor
data = [i for i in range(5)]
mult2(data, 3)
print(data)

这将分别产生输出 0,1,2,3,4 和 0,3,6,9,12。

在 mult2 中,我们通过重新分配一个新值来更改数据的值。为什么别名没有被破坏?

此外,在第一个函数中,如果我遍历列表的每个值并更改它,别名是否损坏?

for val in data: val *= factor

您正在重新分配 val,因此它的 "link" 数据已损坏

for j in range(len(data)): data[j] *= factor

您正在使用来自数据的 "offset",因此 "link" 不会损坏