在迭代时修改列表

2024-05-29 10:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在遍历列表时不应该添加/删除项。但如果不更改列表长度,我可以修改正在迭代的列表中的项吗?

class Car(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return type(self).__name__ + "_" + self.name

my_cars = [Car("Ferrari"), Car("Mercedes"), Car("BMW")]
print(my_cars)  # [Car_Ferrari, Car_Mercedes, Car_BMW]
for car in my_cars:
    car.name = "Moskvich"
print(my_cars)  # [Car_Moskvich, Car_Moskvich, Car_Moskvich]

或者我应该迭代列表索引吗?像这样:

for car_id in range(len(my_cars)):
    my_cars[car_id].name = "Moskvich"

问题是:以上两种方法都允许还是只有第二种方法是无错误的?

如果答案是“是”,那么下面的代码片段是否有效?

lovely_numbers = [[41, 32, 17], [26, 55]]
for numbers_pair in lovely_numbers:
    numbers_pair.pop()
print(lovely_numbers)  # [[41, 32], [26]]

升级版。我想看看python文档,其中说“这些操作是允许的”,而不是别人的假设。


Tags: nameinself列表formydefcar
3条回答

在遍历列表元素时修改列表而不在期间修改列表的示例

list_modified_during_迭代.py

a = [1,2]
i = 0
for item in a:
      if i<5:
          print 'append'
          a.append(i+2)
      print a
      i += 1

在迭代过程中未修改列表。py(将更改为i

a = [1,2]
i = 0
for i in range(len(a)):
    if i<5:
        print 'append'
        a.append(i+2)
    print a
    i += 1

可以说,你不是在修改列表。您只需修改列表中的元素。我不认为这是个问题。

为了回答您的第二个问题,这两种方法都是允许的(正如您所知,因为您运行了代码),但这取决于具体情况。内容是可变的还是不变的?

例如,如果要将一个元素添加到整数列表中的每个元素,则此操作将不起作用:

>>> x = [1, 2, 3, 4, 5]
>>> for i in x:
...     i += 1
... 
>>> x
[1, 2, 3, 4, 5] 

实际上,int是不可变的对象。相反,您需要遍历索引并在每个索引处更改元素,如下所示:

>>> for i in range(len(x)):
...     x[i] += 1
...
>>> x
[2, 3, 4, 5, 6]

如果您的项是可变的,那么毫无疑问,第一种方法(直接迭代元素而不是索引)更有效,因为索引的额外步骤是一个开销,可以避免,因为这些元素是可变的。

I know you should not add/remove items while iterating over a list. But can I modify an item in a list I'm iterating over if I do not change the list length?

你根本没有用任何方式修改列表。您要修改的是列表中的元素;这非常好。只要你不直接更改实际列表,你就没事了。

不需要迭代索引。事实上,这是单折射的。除非您实际尝试更改列表本身,否则只需按值对列表进行迭代。

If the answer is yes, will the following snippet be valid?

lovely_numbers = [[41, 32, 17], [26, 55]]
for numbers_pair in lovely_numbers:
    numbers_pair.pop()
print(lovely_numbers)  # [[41, 32], [26]]

当然。原因和我上面说的完全一样。你没有修改lovely_numbers本身。相反,您只需修改lovely_numbers中的元素

相关问题 更多 >

    热门问题