2024-09-30 14:19:34 发布
网友
以下代码未按预期工作:
l = [1,1] def modifyList(list): for element in list: element += 1 return list
当我运行时,我期望的列表:
是[2,2]而不是[1,1]
有人能解释一下python为什么这样做吗?在
原因是,当你说:
for element in list: element += 1
您从列表中获取一个元素并将其分配给变量element,但这不会更新列表中的元素。因此,列表保持原样,未经修改。在
element
要修改列表:
这将以1迭代方式递增每个元素。在
1
您需要使用索引和增量访问列表元素:
def modifyList(lst): for ind, _ in enumerate(lst): lst[ind] += 1 # access list element by index and increment return lst
或者使用列表理解法,在每个元素中添加1:
{1>如果你不想返回一个新的列表,那就不要返回一个新的列表
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]
{{ints>只会影响到不可变对象列表中,因此不会影响到新的对象。如果你的列表中有一个可变的对象,并且你对它进行了变异,那么这些变化将被反映出来,但是在你的代码中,你只需临时创建一个新的变量并将其丢弃。在
原因是,当你说:
您从列表中获取一个元素并将其分配给变量
element
,但这不会更新列表中的元素。因此,列表保持原样,未经修改。在要修改列表:
^{pr2}$这将以
1
迭代方式递增每个元素。在您需要使用索引和增量访问列表元素:
或者使用列表理解法,在每个元素中添加1:
^{pr2}${1>如果你不想返回一个新的列表,那就不要返回一个新的列表
现在只要调用传递列表的函数,就会更改传入的原始列表/对象:
创建新列表/对象:
现在创建一个新列表,保持原始列表不变:
{{ints>只会影响到不可变对象列表中,因此不会影响到新的对象。如果你的列表中有一个可变的对象,并且你对它进行了变异,那么这些变化将被反映出来,但是在你的代码中,你只需临时创建一个新的变量并将其丢弃。在
相关问题 更多 >
编程相关推荐