首页 > 解决方案 > 在python中使用for循环为迭代器的元素分配新值的麻烦

问题描述

我在使用 for 循环为迭代器的元素分配新值时遇到问题。假设我们有这个列表:

some_2d_list = [['mean', 'really', 'is', 'jean'],
 ['world', 'my', 'rocks', 'python']]
为什么此代码有效并更改原始列表的元素(反转本身是列表的元素):

for items in some_2d_list:
        items = items.reverse()

但是这个没有(在这种情况下,我们将不得不使用索引来应用更改):

for items in some_2d_list:
        items = ["some new list"]
我期待后一个代码的结果是:

some_2d_list = [["some new list"],
 ["some new list"]]

标签: pythonfor-loopiteratoriterationvariable-assignment

解决方案


list.reverse就地反转并返回无,所以

for items in some_2d_list:
    items = items.reverse()

反转仍然存在的现有列表some_2d_list并分配Noneitems.

当你在代码块中输入时for items in some_2d_listitems仍然是对对象的引用some_2d_list。任何修改现有列表的东西some_2d_list也会影响。例如

>>> some_2d_list = [['mean', 'really', 'is', 'jean'],
...  ['world', 'my', 'rocks', 'python']]
>>> 
>>> for items in some_2d_list:
...     items.append('foo')
...     del items[1]
... 
>>> some_2d_list
[['mean', 'is', 'jean', 'foo'], ['world', 'rocks', 'python', 'foo']]

像“+=”这样的增强操作是模棱两可的。根据任何给定类型的实现方式,它可以就地更新或创建新对象。他们为列表工作

>>> some_2d_list = [['mean', 'really', 'is', 'jean'],
...  ['world', 'my', 'rocks', 'python']]
>>> 
>>> for items in some_2d_list:
...     items += ['bar']
... 
>>> some_2d_list
[['mean', 'really', 'is', 'jean', 'bar'], ['world', 'my', 'rocks', 'python', 'bar']]

但不适用于元组

>>> some_2d_list = [('mean', 'really', 'is', 'jean'), ('world', 'my', 'rocks', 'python')]
>>> for items in some_2d_list:
...     items += ('baz',)
... 
>>> some_2d_list
[('mean', 'really', 'is', 'jean'), ('world', 'my', 'rocks', 'python')]

推荐阅读