以下代码无效:
l = [1,1]
def modifyList(list):
for element in list:
element += 1
return list
我在运行时期望的列表:
modifyList(l)
是[2,2]而不是[1,1]
有人可以解释为什么python以这种方式行事吗?
答案 0 :(得分:4)
您需要使用索引和增量来访问list元素:
def modifyList(lst):
for ind, _ in enumerate(lst):
lst[ind] += 1 # access list element by index and increment
return lst
或者使用列表推导并简单地为每个元素添加1:
def modifyList(lst):
lst[:] = [ele +1 for ele in lst] # lst[:] changes the original list
return lst
如果您正在修改原始列表,则实际上并不需要返回值,如果要创建新列表,则只需返回列表解析:return [ele +1 for ele in lst]
def mod_in_place(lst):
lst[:] = [ele +1 for ele in lst] # lst[:] changes the original list
现在只需调用传递列表的函数将更改传入的原始列表/对象:
In [3]: l = [1,1]
In [4]: mod_in_place(l)
In [5]: l
Out[5]: [2, 2]
创建新列表/对象:
def create_new_list(lst):
return [ele + 1 for ele in lst]
现在创建一个新列表,保留原文:
In [7]: l = [1,1]
In [8]: l2 = create_new_list(l)
In [9]: l
Out[9]: [1, 1] # original list not changed
In [10]: l2
Out[10]: [2, 2]
您的代码只是使用element += 1
创建一个新对象,int是不可变的,因此您不会影响列表中存储的对象。如果你的列表中有一个可变对象并且你发生了变异,那么这些变化就会反映出来,但是在你的代码中你只是暂时创建一个新的变量并把它扔掉。
答案 1 :(得分:1)
原因是,当你说:
for element in list:
element += 1
您从列表中获取一个元素并将其分配给变量element
,但这不会更新列表中的元素。因此,清单保持原样,未经修改。
修改清单:
for i in range(len(list)):
list[i]+=1
这将迭代地将每个元素递增1
。