Как в Python присвоить нескольким переменным одинаковое значение?
Подскажите, как в Pyton можно кратко присвоить нескольким переменным одинаковое значение.
Мне нужно, чтобы было a, b, c = [], но такая запись не работает :((
Сколько ни гуглил, нашёл лишь 4 варианта:
1) a = b = c = []
2) a, b, c = [], [], []
3) a, b, c = [[]] * 3
4)
a = []
b = []
c = []
В первом варианте проблема в том, что переменные будут ссылаться друг на друга.
Во втором варианте проблема в длине записи, если элементов много, то замучаешься перечислять.
Четвёртый вариант аналогичен второму, только запись не в строчку, а в столбик.
Думал спасение в третьем варианте, но он подходит разве что для чисел, там нет проблем, если стартовое значение переменной будет храниться в списке. А как быть, если нужен пустой список ? Тогда запись a, b, c = [[]] * 3 не подойдёт, так как хоть для каждой переменной и создастся отдельный пустой список, но из-за того, что все они будут внутри ещё одного списка алгоритм не будет правильно работать.
Есть какой-нибудь вариант как в одну строку нескольким переменным присвоить значение (в частности интересует создание пустого списка для каждой переменной) ?
P.S.: наверное, в случае с созданием пустого списка правильнее говорить не "переменная", а "имя" по отношению к a, b, c ? Ну, суть вопроса от этого не меняется ) В названиях пока не силён.
Мне нужно несколько временных списков, их нужно сначала объявить, вот думаю как их все разом объявить, а не по одному. Может быть можно обойтись без создания пустого списка, я не шарю пока.
sswwssww, если использовать a, b, c = (list() for _ in range(3)) то у них будет тип 'class generator'. Когда использовать append возникает вот такая ошибка : 'generator' object has no attribute 'append'
Случайно не знаете как исправить ?
ZeroBug, у кого у них? Выражение (list() for _ in range(3)) создает генератор, а "a, b, c" "распаковывает" его, и получается что "а, b, c" - это list-ы. append применительно к ним работает как и должен.
огда запись a, b, c = [[]] * 3 не подойдёт, так как хоть для каждой переменной и создастся отдельный пустой список, но из-за того, что все они будут внутри ещё одного списка алгоритм не будет правильно работать.
Не отдельный, а тот е самый. И всё будет правильно работать, разве что все переменные получат одини тот же пустой список.
Однако, если вам нужен такой грязный код и вы при этом экономите на длине строки, значит что-то вы делаете неправильно. locals().update({k:[] for k in 'abcd'})
Такой код только запутывает, а огромное число одинаковых переменных говорит, что вам их лучше положить в словарь или матрицу.
Спасибо за ответ, но я новичок, ещё только в начале пути, можно без абстракций "грязный код", "чистый код", понятия не имею, что это такое. Код стараюсь максимально компактным сделать, с комментариями.
Не отдельный, а тот е самый. И всё будет правильно работать, разве что все переменные получат одини тот же пустой список.
Вот значит как, всё-таки один список на всех, видимо в этом и проблема. Поэтому такой вариант и не работает. Они должны быть независимы друг от друга (списки).
Soul1, код должен быть максимально понятным, а не компактным.
Исходный код на языках программирования (тем более высокого уровня) пишется не для компьютера, а в первую очередь для человека. Человеку должно быть легко такой код писать, должно быть легко его потом читать и понимать. Это поможет исправлять ошибки, модифицировать функциональность при необходимости, проверять корректность, исследовать на предмет побочных эффектов.
Если у вас куча переменных принимают одно и то же значение - так и пишите. Не экономьте на строчках и символах, они бесплатны, зато потом гораздо дороже обойдётся отладка и модификация.
Мне пустые списки как таковые не нужны, мне нужно объявить список для переменной (или имени, называйте как хотите), чтобы следующим действием скопировать в него данные из другого списка. И так несколько раз на протяжении всего кода. Поэтому я хочу в самом начале объявить несколько списков, соответственно пустых, там ничего не должно быть.
Сергей Паньков, понял вас. В принципе да, согласен, это не критично. Но надеялся, что вместо такой записи:
a, b, c = [], [], []
можно написать вот так:
a, b, c = []
или типа того.
Вообще изначально пишу в столбик
a = []
b = []
c = []
Потом уже корректирую.
нет разницы кортежи это или списки. они одинаково распаковываются.
У автора вопроса проблема с компактной записью перечня изменяемых объектов. При умножении получается список, состоящих из одного и того же объекта.
qid00000000, ничто не мешает,кроме лишнего запутывания кода. Правильнее просто присвоить как обычно.
Своим ответом я просто проиллюстрировал бессмсленность таких упоротых способов. Считайте это сарказмом
Такое решение работает. Что с copy(), что без него.
Вот такая запись в моём коде работает: a3, a4, a5, s2 = [], [], [], []
А вот такая запись в моём коде не работает: a3, a4, a5, s2 = ([].copy() for i in range(4))
И вот такая запись в моём коде тоже не работает: a3, a4, a5, s2 = ([] for i in range(4))
Объясните моему коду, что он должен работать при любом варианте, буду благодарен )
Кстати, как посоветовал человек в верхнем комментарии с ником sswwssww такая запись: a3, a4, a5, s2 = (list() for i in range(4)) - прекрасно работает.
aRegius, перепроверил, действительно работает. А вчера не работало. Возможно вчера скопировал криво, либо же в range было указано кол-во < или > чем кол-во элементов слева (тут был пример с 3 переменными, а в коде их 4, может забыл изменить при копировании). Так что видимо где-то ошибка с моей стороны была, был неправ.