1

可能重复:
迭代时修改列表

我正在编写一个 python 脚本,我试图从方法内部将对象附加到在类的主体中创建的 List 中。

到目前为止,我的代码是这样的:

class Worker:

    myList = ['one item', 'second item']

    def itter_List_Func(self, list_param):
       for item in list_param:
           more_items = item.split()
           self.myList[:] = [self.myList + item for item in more_items]

但是对于一种奇怪的时尚,我遇到了一些“迭代错误时无法修改列表”。我是否应该保留原地更改并尝试使用新项目创建一个新的 List 对象?或者这会由于失去对 list_param 或其他东西的引用而产生更多问题?

4

2 回答 2

1

好的,从 avasal 提供给我的链接以及关于堆栈溢出的进一步阅读中,我了解到我正在尝试做的是一个坏主意。也许我应该尝试迭代原始列表的副本,或者对原始列表的副本进行分配,因为如果我在迭代时对列表进行更改,迭代器将不会被告知这一点,从而导致非常奇怪的行为或运行时错误。

于 2012-07-12T10:18:05.343 回答
1

要明确“直接创建新列表”的想法,您需要以下内容:

myList = sum((item.split() for item in myList), [])

这是简单编写的方式,不幸的是,如果您有很多项目,它会变得很慢(因为sum依赖于加法,而加法不是list在 Python 中加入 s 的有效方法)。使用显式循环:

result = []
for item in myList:
    result.extend(item.split())
myList = result

即:我们不创建列表的副本并尝试对其进行修改;我们创建一个空白列表并迭代地将其转换为我们想要的,使用原始列表作为流程的输入。

顺便说一句,您在这里有两个可能的设计问题:您似乎希望函数在每次调用时都被传递一个特定的值,并且您已经定义了一个类属性,您可能想要一个实例属性来代替。

于 2012-07-12T10:44:42.593 回答