2017-02-12 114 views
-2

重复编辑:还有另外一个question被标记为相似,但它不同,因为它只涉及.append和完整列表实例。我的问题是关于偏移分配(data [j])和迭代器(在第一个函数中使用)。Python by-object confusion


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

现在我有这2个功能:

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

尝试从函数返回值:'return val'然后将函数的结果作为变量存储并输出:'data = scale1(data,3); print(data)' – GH05T

+0

我知道val只是一个int,我的问题是数据。为什么val不会改变数据的价值? – Maude

回答

1

for val in data: val *= factor

您重新分配VAL因此它的“链接”到的数据被破坏

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

您正在使用从数据的“抵消”,因此,“链接”不破坏

+0

我明白了,但为什么?我不明白为什么使用偏移量不会中断链接,而只是循环遍历迭代器呢? – Maude

+1

如果你知道c,这会更有意义。让我试着在第一种方法中解释: ,你说val是指向列表中的一个值,然后你赋值val一个不同的值,你没有改变列表中的任何东西,你只是告诉cal指向一些东西否则,所以列表保持不变。 在第二种方法中数据是一个列表,将数据看作是指向一组单元格的开始处的数据,因此'data [0]'会为您提供数据中的第一个单元格,如果您更改它则直接更改单元格,而不是指向它的东西。这是否更有意义? – Nullman

+0

它变得更清晰了!这是否意味着对函数内部数据的任何操作(append,remove,pop)都会改变函数外部的值? – Maude