Python列表,增量和&返回修改后的列表

时间:2015-06-20 10:37:46

标签: python list

以下代码无效:

l = [1,1]

def modifyList(list):
  for element in list:
    element += 1
  return list

我在运行时期望的列表:

modifyList(l)

是[2,2]而不是[1,1]

有人可以解释为什么python以这种方式行事吗?

2 个答案:

答案 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