Обновление списка в классе Python с использованием цикла for - PullRequest
0 голосов
/ 22 апреля 2020

Если у меня есть класс Python, который включает список, каков наилучший способ обновить этот список внутри для l oop?

Например:

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-l oop, но требует пересоздания списка

Я уверен, что есть много других способов работы (причудливые методы понимания списков) , et c) тоже, но меня интересует удобочитаемость / ясность в отношении краткости.

Примечание: есть довольно много вопросов, которые, кажется, намекают на это, но (из того, что я обнаружил) большинство заключено в код проекта или укажите c проблемы - я ищу общий наилучший ответ.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Значение 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)
1 голос
/ 22 апреля 2020

это хорошо:

for i in range(len(list)):
    list[i] += sth
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...