为什么我不能以这种方式改变列表?

时间:2013-09-28 17:05:09

标签: python list function reference

我希望有一个很好的set all list elements to a default value功能。我提出的那个不起作用,但我的第二个解决方案确实如此。任何人都可以告诉我为什么它以一种方式工作而不是另一种方式?

第一个解决方案:

def set_all(the_list,value): #NOT doing anything
    for item in the_list:
        item = value

第二个解决方案:

def set_all(the_list,value): #working as intended
    for i,item in enumerate(the_list):
        the_list[i] = value

3 个答案:

答案 0 :(得分:5)

当你这样做时:

for item in the_list:
    item = value

您只是将名称 item重新分配给其他内容(value,具体而言),但您没有触及引用< / em> the_list[i]该列表必须包含原始项目。

因此,您实际上并没有触及该列表,因此它不会发生变化。


你可以这样看:

执行for item in the_list时,您将创建对基础对象的新引用:item

当您执行item = value时,您正在更改该引用并将其指向其他内容。但另一个参考,列表对底层对象的参考,保持不变。

当然,当您执行the_list[i]时,您实际上正在更改该列表对该对象的引用,这就是它工作的原因。

答案 1 :(得分:2)

在第一个循环中,item是对列表中项目的引用,而不是列表中的插槽。更改它不会更改列表。

要更改列表,您需要知道您正在处理哪个插槽,这是您在第二种情况下正在执行的操作。

答案 2 :(得分:0)

为什么不用这个?

更容易
the_list = [default_value]*len(the_list)