我希望有一个很好的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
答案 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)