2010-12-10 3 views
4

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

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

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

Я попытался

level1 = level2 = level3 = {} 

Но это, кажется, создает копию объекта, который является не то, что я хочу. И

level1, level2, level3 = {} 

выдает сообщение об ошибке.

+1

*, что, кажется, создает копии объекта * - Код 'level1 = level2 = level3 = {}' не создает никаких копий dict. –

+2

Просто терминология nitpick, но 'level1 = level2 = level3 = {}' на самом деле не создает копии. Если он создаст копию, поведение будет именно тем, что вы хотите. Вместо этого он назначает все 3 одному и тому же объекту, а не копиям объекта. – Davy8

+6

@ Davy8 Я не думаю, что это ничто, когда кто-то сказал противоположное тому, что они хотели сказать. –

ответ

14

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

levels = [{}, {}, {}] 
+0

Или используйте понимание списка, предложенное @nils: 'levels = [{} для _ в диапазоне (3)]' –

+2

или, если на то пошло 'levels = []', и добавьте свои словари, как вы их делаете – Pete

11

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

level1, level2, level3 = {}, {}, {} 
16
level1 = level2 = level3 = {} 

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

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

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

level1, level2, level3 = {}, {}, {} 
+8

В Python vernacular, 'dummy' лучше указывается одним подчеркиванием' _' –

+0

Не, если вы хотите использовать '_' для gettext. – nils

0

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: {} 
1

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

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

0

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

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

Что вы подразумеваете, если быстрее?

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

level1, level2, level3 = {}

От Python documentation:

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

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

Показаны явно они предлагают это:

(level1, level2, level3) = ({}, {}, {},) 
-1

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

+0

У этой проблемы была бы такая же проблема. – kqr

Смежные вопросы