我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目?
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文档中看到“允许这些操作”而不是某人的假设。
可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为这是个问题。
为了回答第二个问题,确实允许两种方式(众所周知,因为您运行了代码),但这取决于情况。内容是可变的还是不变的?
例如,如果要向整数列表中的每个元素添加一个,则此方法将无效:
>>> x = [1, 2, 3, 4, 5] >>> for i in x: ... i += 1 ... >>> x [1, 2, 3, 4, 5]
的确,ints是不可变的对象。相反,您需要遍历索引并更改每个索引处的元素,如下所示:
int
>>> for i in range(len(x)): ... x[i] += 1 ... >>> x [2, 3, 4, 5, 6]
如果您的项目是可变的,那么毫无疑问,第一种方法(直接迭代元素而不是索引)效率更高,这是因为索引的额外步骤是可以避免的,因为这些元素是可变的。