Python: определить несколько переменных одного типа? - PullRequest
4 голосов
/ 10 декабря 2010

Вероятно, дубликат, но я не могу найти ответ, по крайней мере, поиск по этим терминам.

Есть ли более быстрый способ сделать это в Python?

level1 = {}
level2 = {}
level3 = {}

Я пробовал

level1 = level2 = level3 = {}

Но похоже, что это создает копии объекта, а это не то, что я хочу. И

level1, level2, level3 = {}

выдает ошибку.

Ответы [ 8 ]

16 голосов
/ 10 декабря 2010
level1 = level2 = level3 = {}

Не создает копии. Это позволяет ссылочный уровень {1-3} для того же объекта. Вместо этого вы можете использовать понимание списка:

level1, level2, level3 = [{} for dummy in range(3)]

или более читаемый:

level1, level2, level3 = {}, {}, {}
14 голосов
/ 10 декабря 2010

Ваше имя переменной является возможным признаком того, что ваш дизайн может быть улучшен. Возможно, лучше использовать список вместо трех отдельных переменных:

levels = [{}, {}, {}]
11 голосов
/ 10 декабря 2010

Вы могли бы сделать

level1, level2, level3 = {}, {}, {}
3 голосов
/ 10 декабря 2010
level1, level2, level3, = {}, {}, {}
1 голос
/ 10 декабря 2010

Лично я никогда не изменяю код, чтобы сжать больше материала в одной строке.Я бы выполнил три разных задания, по одному на строку.

Однако, если есть внесенные в документ изменения в производительности, это другое дело.Я просто не знаю каких-либо улучшений производительности с этими изменениями.Только запутывание.

0 голосов
/ 12 июня 2013

Попробуйте это: level1, level2, level3 = [{}] * 3

0 голосов
/ 10 декабря 2010

Люди уже ответили на ваш вопрос, но ...

Есть ли более быстрый способ сделать это в Python?

Что вы имеете в видубыстрее?

Я думаю, что ваш реальный вопрос должен быть"как питонский способ сделать это?"

level1, level2, level3 = {}

Из документации Python :

Tuplesсоздаются оператором запятой (не в квадратных скобках), с или без заключающих в скобки, но пустой кортеж должен иметь заключающие в скобки, такие как a, b, c или ().Одиночный кортеж элемента должен иметь запятую, такую ​​как (d,).

a, b, c неявно (a, b, c).Вот почему вам нужно иметь три кортежа на правой стороне, как предлагают другие постеры (nils, sdolan, gunner).

Явно показано, что они предлагают это:

(level1, level2, level3) = ({}, {}, {},)
0 голосов
/ 10 декабря 2010

Python интерпретируется, что позволяет определять вещи во время выполнения.

def prefixed_range(prefix, start, stop=None, step=1):
    " Like xrange() but results are prefixed numeric strings. """
    prefix = str(prefix)
    if stop is None:
        start, stop = 0, start
    for i in xrange(start, stop, step):
        yield prefix + str(i)

def define_vars(names, value=None, namespace=None):
    namespace = globals() if not namespace else namespace
    factory = (lambda: value) if not callable(value) else value
    for name in names:
        namespace[name] = factory()

define_vars(prefixed_range('level', 1, 4), dict)

print 'level1: {}, level2: {}, level3: {}'.format(level1, level2, level3)
# level1: {}, level2: {}, level3: {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...