-1

我想有一个很好的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
4

3 回答 3

5

当你这样做时:

for item in the_list:
    item = value

您只是将名称 item重新分配给其他东西(value特别是 ),但您没有触及列表对原始项目的引用。 the_list[i]

因此,您实际上并没有触摸该列表,因此它不会改变。


你可以这样看:

当您这样做时for item in the_list,您将创建一个对基础对象的新引用:item.

当您这样做时item = value,您正在更改该引用并将其指向其他内容。但是另一个引用,即列表对基础对象的引用,保持不变。

当然,当您这样做时the_list[i],您实际上是在更改列表对对象的引用,这就是它起作用的原因。

于 2013-09-28T17:06:57.523 回答
2

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

要更改列表,您需要知道您正在处理的插槽,这就是您在第二种情况下所做的。

于 2013-09-28T17:07:11.290 回答
0

为什么不使用这个?它更容易

the_list = [default_value]*len(the_list)
于 2013-09-28T17:07:58.813 回答