重复编辑:还有另一个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中,我们通过重新分配新值来更改数据的值。为什么别名被打破?
另外,在第一个函数中,如果我遍历列表中的每个值并且我更改它,别名是否被破坏?
答案 0 :(得分:1)
for val in data:
val *= factor
你正在重新分配val,所以它的"链接"数据被打破
for j in range(len(data)):
data[j] *= factor
你正在使用"偏移"来自数据,所以"链接"不会被打破