如果我有一个包含列表的Python类,在for循环中更新列表的最佳方法是什么?
比如说
class Test:
def __init__(self):
self.values = [ 1, 2, 3 ]
def does_not_work(self):
for value in self.values:
value += 1
def this_works(self):
for i, value in enumerate(self.values):
self.values[i] += 1
def works_too(self):
new_values = []
for value in self.values:
value += 1
new_values.append(value)
self.values = new_values
t = Test()
print t.values
>> [ 1, 2, 3 ]
t.does_not_work()
print t.values
>> [ 1, 2, 3 ]
t.this_works()
print t.values
>> [ 2, 3, 4 ]
t.works_too()
print t.values
>> [ 3, 4, 5 ]
enumerate()
我相信还有很多其他的工作方法(花哨的列表理解方法等),但我对可读性(readabilityclarity)比简洁性更感兴趣。
注意:有不少问题似乎暗示了这一点,但(从我发现的情况来看)大多数问题都被包裹在项目代码或具体问题中--我正在寻找一个通用的最佳实践答案。
一个 int
值是不可改变的。
在备选方案1中: value += 1
只需将其命名为 value
到一个新的对象,而不改变任何关于已经在 self.values
.
在选项2中,您修改了 列表 指的是一个新的值,而不是现有的值。
在选项 3 中,您创建了一个新的列表,然后改变了 self.value
来引用该列表。
在这三个选项中,您都没有改变任何一个在 self.values
.
我可能会直接创建一个新的列表与列表理解。
self.values = [x + 1 for x in self.values]
但如果你想避免创建一个新的列表, 你可以使用分片分配来重新分配到现有列表的每个元素。
self.values[:] = (x + 1 for x in self.values)
这很好。
for i in range(len(list)):
list[i] += sth