Python副对象混淆[重复]

这个问题在这里已有答案:

Duplicate edit : 还有一个被标记为类似的question,但它有所不同,因为它只讨论.append和完整列表实例 . 我的问题是关于偏移分配(data [j])和迭代器(在第一个函数中使用) .


我对Python的副对象信息传递有点困惑 . 从我的教科书中,当函数接收到它的参数时,它会为初始对象创建一个别名 . 另外,关于可变参数:“我们注意到将新值重新分配给形式参数,例如通过设置list = [],不会改变实际参数;这样的重新分配会破坏别名” .

现在我有这两个功能:

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中,我们通过重新分配新值来更改数据的值 . 为什么别名坏了?

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

回答(1)

2 years ago

for val in data: val *= factor

您正在重新分配val,因此它与数据的“链接”被破坏了

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

您正在使用数据的“偏移量”,因此“链接”不会被破坏