在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)

给TA打赏
共{{data.count}}人
人已打赏
解决方案

为jdbc sink连接器提取和转换kafka消息的特定字段。

2022-4-22 16:09:03

解决方案

按最后第二个字母排序的Unix命令

2022-4-22 16:09:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索