Python列表,increment&;返回修改后的列表
以下代码无法按预期工作:Python列表,increment&;返回修改后的列表,python,list,Python,List,以下代码无法按预期工作: l = [1,1] def modifyList(list): for element in list: element += 1 return list 当我运行时,我期望的列表: modifyList(l) 是[2,2]而不是[1,1] 有人能解释一下python为什么会这样做吗?您需要使用索引和增量访问列表元素: def modifyList(lst): for ind, _ in enumerate(lst): ls
l = [1,1]
def modifyList(list):
for element in list:
element += 1
return list
当我运行时,我期望的列表:
modifyList(l)
是[2,2]而不是[1,1]
有人能解释一下python为什么会这样做吗?您需要使用索引和增量访问列表元素:
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]
您的代码只是创建了一个
元素+=1
的新对象,int是不可变的,因此不会影响列表中存储的对象。如果列表中有一个可变对象,并且您对其进行了变异,那么更改将反映在代码中,但您只需临时创建一个新变量并将其丢弃。您需要使用索引和增量访问列表元素:
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]
您的代码只是创建了一个
元素+=1
的新对象,int是不可变的,因此不会影响列表中存储的对象。如果您的列表中有一个可变对象,并且您对其进行了变异,那么更改将反映在代码中,但您只需临时创建一个新变量并将其丢弃。原因是,当您说:
for element in list:
element += 1
您正在从列表中获取一个元素并将其分配给变量element
,但这不会更新列表中的元素。因此,列表保持原样,未修改
要修改列表,请执行以下操作:
for i in range(len(list)):
list[i]+=1
这将以迭代方式将每个元素增加
1
。原因是,当您说:
for element in list:
element += 1
您正在从列表中获取一个元素并将其分配给变量element
,但这不会更新列表中的元素。因此,列表保持原样,未修改
要修改列表,请执行以下操作:
for i in range(len(list)):
list[i]+=1
这将迭代地将每个元素增加
1
。或者谢谢-一个问题,为什么我们需要说lst[:]=comp
,而不仅仅是lst=comp
——为什么要使用切片?@PipS,它会像for循环一样更改原始列表,您可以删除返回值,打印原始列表l
,您将看到更改。如果您想要一个新的列表,正如我在回答中所说的,只需返回列表即可。您可以使用函数修改列表吗?我认为这些参数是隐式独立的副本,您需要将它们指定为全局或使用return来实际修改传入的参数。@SuperBiasedMan,不,您只是传递了一个引用。谢谢-一个问题,为什么我们需要说lst[:]=comp
而不仅仅是lst=comp
——为什么要使用切片?@PipS,它会像for循环一样更改原始列表,您可以删除返回,打印原始列表l
,然后您将看到更改。如果您想要一个新的列表,正如我在回答中所说的,只需返回列表即可。您可以使用函数修改列表吗?我认为这些参数是隐式独立的副本,您需要将它们指定为全局或使用return来实际修改传入的参数。@SuperBiasedMan,不,您只是传递了一个引用。