2010-12-10 119 views
4

可能是重复的,但我至少无法通过搜索这些术语来找到答案。Python:定义多个相同类型的变量?

在Python中有更快的方法吗?

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

我已经试过

level1 = level2 = level3 = {} 

,但似乎创建对象,这是不是我想要的副本。并且

level1, level2, level3 = {} 

将引发错误。

+1

*似乎创建对象*的副本 - 的代码'level1 = level2 = level3 = {}'不会创建字典的任何副本。 – 2010-12-10 18:02:13

+2

只是一个术语nitpick,但'level1 = level2 = level3 = {}'实际上不是创建副本。如果它创建了一个副本,那么行为就是你想要的。相反,它将全部3分配给同一个对象,而不是对象的副本。 – Davy8 2010-12-10 18:04:07

+6

@ Davy8当有人说出与他们想说的相反的意思时,我不认为这是挑剔的。 – 2010-12-10 18:24:48

回答

14

你的变量命名是一个可能的迹象,表明你的设计还有待改进。这可能是最好使用一个列表,而不是三个独立的变量:

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

或者使用@nils建议的列表理解:'levels = [{} for _ in range(3)]' – 2010-12-10 18:23:27

+2

或者那个'levels = []'并且添加你的字典。 – Pete 2010-12-10 19:44:42

11

你可以做

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

不创建副本。它让参考级别{1-3}到相同的对象。您可以使用列表理解来代替:

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

或更具可读性:

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

在Python中, 'dummy'最好用单个下划线表示'_' – 2010-12-10 18:09:12

+0

如果你想使用'_'作为gettext,则不行。 – nils 2010-12-10 19:39:12

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做到这一点?

你是什么意思,更快?

我认为你真正的问题应该是“这是什么pythonic方式?“

1级,级别2,级别3 = {}

Python documentation

元组由逗号运算(方括号内不)构造,具有或不具有括起括号,但是空元组必须包含括号,例如a,b,c或()。单个元组元组必须包含尾随逗号,如(d,)

a,b,c隐式地(a,b,c)。这就是为什么你需要像其他海报(nils,sdolan,gunner)所建议的那样在右侧有一个三元组。

明确地示出它们被暗示此:

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

尝试此: 1级,级别2,级别3 = [{}] * 3

+0

这会有同样的问题。 – kqr 2013-06-11 20:54:38

相关问题