迭代时修改Python列表

时间:2017-07-01 18:59:31

标签: python list oop iteration

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

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]]

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

4 个答案:

答案 0 :(得分:14)

修改列表,可以这么说。您只需修改列表中的元素。我不相信这是一个问题。

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

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

>>> 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]

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

答案 1 :(得分:4)

  

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

您根本不会以任何方式修改列表。您 修改的内容是列表中的元素;那很好。只要您不直接更改实际列表,就可以了。

没有必要迭代索引。事实上,这是一个单一的。除非您实际上尝试更改列表本身,否则只需按值迭代列表。

  

如果答案是肯定的,那么以下代码段是否有效?

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中的元素。

答案 2 :(得分:0)

示例,其中的列表被修改,而不是在迭代列表的元素时被修改

list_modified_during_iteration.py

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

list_not_modified_during_iteration.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

答案 3 :(得分:-1)

当然,你可以。第一种方法是正常的,但在某些情况下,您也可以使用list comprehensionsmap()