在Python类中使用for循环更新列表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python类中使用for循环更新列表相关的知识,希望对你有一定的参考价值。
如果我有一个包含列表的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-loop语法,但需要重新建立列表。
我相信还有很多其他的工作方法(花哨的列表理解方法等),但我对可读性(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
以上是关于在Python类中使用for循环更新列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用引导程序和 for 循环在 django 中创建电影片段?
python中的while循环与for循环怎么样那个比较好用?