【发布时间】:2017-12-05 11:20:12
【问题描述】:
我知道您不应该在迭代列表时添加/删除项目。但是,如果我不更改列表长度,我可以修改我正在迭代的列表中的项目吗?
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"
问题是:以上两种方式都允许还是只有第二种方式没有错误?
如果答案是肯定的,那么下面的sn-p是否有效?
lovely_numbers = [[41, 32, 17], [26, 55]]
for numbers_pair in lovely_numbers:
numbers_pair.pop()
print(lovely_numbers) # [[41, 32], [26]]
UPD。我想看看 python 文档,它说“这些操作是允许的”,而不是某人的假设。
【问题讨论】:
-
是的,只要不改变长度就不会遇到问题。最后一点,如果您的列表在弹出之前为空,您将遇到 IndexError。
-
@diccza 文档也没有提到是否允许改变大小。它是。所有这些操作都是允许的,否则你会得到一个语法错误。这是一个风格问题,以及作为一名优秀的程序员你应该不做什么。
-
您已经有两个答案说修改列表本身与修改列表中的元素不同。这是正确的,但可能会让某些人感到困惑。记住列表只包含引用(即指针)可能会有所帮助。为了进一步阅读,我强烈推荐 Ned Batchelder 的 this article。