微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

迭代时修改列表

如何解决迭代时修改列表

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

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

例如,如果要向整数列表中的每个元素添加一个,则此方法将无效:

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

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

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

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

解决方法

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

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文档中看到“允许这些操作”而不是某人的假设。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。