【发布时间】:2023-03-05 11:19:02
【问题描述】:
如果我有一个包含列表的 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 ]
- 选项 #1:更新列表中的值不会“坚持”,因此这显然不是正确的方法
- 选项 #2:按预期工作,但需要
enumerate() - 选项 #3:使用更简单的 for 循环语法,但需要重新构建列表
我确信还有很多其他的方法(花哨的列表理解方法等)也可以工作,但我对可读性/清晰而不是简洁感兴趣。
注意:似乎有很多问题暗示了这一点,但(据我发现)大多数问题都包含在项目代码或特定问题中——我正在寻找一般的最佳实践答案。
【问题讨论】:
-
int是不可变的。value += 1只是更改局部变量value所指的内容,然后在循环下次分配value时丢弃该对象。