python - 迭代时修改列表

标签 python list 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]]

更新。我希望看到 python 文档中说“允许这些操作”而不是某些人的假设。

最佳答案

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

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

例如,如果你想给整数列表中的每个元素加一,这是行不通的:

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

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

关于python - 迭代时修改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864393/

相关文章:

Perl:遍历 INI 文件

python - 在 3D 图中剪辑 contourf() 图

python - 使用 SciPy 规则网格在 Python 中进行快速二维插值以进行分散/不规则评估

python - 仅获取特定索引处具有最低值的子列表

c++ - std::list 中的 pop_back() 返回值?

PYTHON:不增加列表元素的位置

python - 'easy_install' 期间发出的警告

jquery - 使用 HTML5 将二进制字符串发布到 Django 应用程序

list - 你能把 Haskell 列表变成一系列 do 指令吗?

python - 弗洛伊德三角