我知道在遍历列表时不应该添加/删除项。但如果不更改列表长度,我可以修改正在迭代的列表中的项吗?
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文档,其中说“这些操作是允许的”,而不是别人的假设。
在遍历列表元素时修改列表而不在期间修改列表的示例
list_modified_during_迭代.py
在迭代过程中未修改列表。py(将项更改为i)
可以说,你不是在修改列表。您只需修改列表中的元素。我不认为这是个问题。
为了回答您的第二个问题,这两种方法都是允许的(正如您所知,因为您运行了代码),但这取决于具体情况。内容是可变的还是不变的?
例如,如果要将一个元素添加到整数列表中的每个元素,则此操作将不起作用:
实际上,
int
是不可变的对象。相反,您需要遍历索引并在每个索引处更改元素,如下所示:如果您的项是可变的,那么毫无疑问,第一种方法(直接迭代元素而不是索引)更有效,因为索引的额外步骤是一个开销,可以避免,因为这些元素是可变的。
你根本没有用任何方式修改列表。您要修改的是列表中的元素;这非常好。只要你不直接更改实际列表,你就没事了。
不需要迭代索引。事实上,这是单折射的。除非您实际尝试更改列表本身,否则只需按值对列表进行迭代。
当然。原因和我上面说的完全一样。你没有修改
lovely_numbers
本身。相反,您只需修改lovely_numbers
中的元素。相关问题 更多 >
编程相关推荐