可能是重复的,但我至少无法通过搜索这些术语来找到答案。Python:定义多个相同类型的变量?
在Python中有更快的方法吗?
level1 = {}
level2 = {}
level3 = {}
我已经试过
level1 = level2 = level3 = {}
,但似乎创建对象,这是不是我想要的副本。并且
level1, level2, level3 = {}
将引发错误。
可能是重复的,但我至少无法通过搜索这些术语来找到答案。Python:定义多个相同类型的变量?
在Python中有更快的方法吗?
level1 = {}
level2 = {}
level3 = {}
我已经试过
level1 = level2 = level3 = {}
,但似乎创建对象,这是不是我想要的副本。并且
level1, level2, level3 = {}
将引发错误。
你的变量命名是一个可能的迹象,表明你的设计还有待改进。这可能是最好使用一个列表,而不是三个独立的变量:
levels = [{}, {}, {}]
或者使用@nils建议的列表理解:'levels = [{} for _ in range(3)]' – 2010-12-10 18:23:27
或者那个'levels = []'并且添加你的字典。 – Pete 2010-12-10 19:44:42
你可以做
level1, level2, level3 = {}, {}, {}
level1, level2, level3, = {}, {}, {}
level1 = level2 = level3 = {}
不创建副本。它让参考级别{1-3}到相同的对象。您可以使用列表理解来代替:
level1, level2, level3 = [{} for dummy in range(3)]
或更具可读性:
level1, level2, level3 = {}, {}, {}
在Python中, 'dummy'最好用单个下划线表示'_' – 2010-12-10 18:09:12
如果你想使用'_'作为gettext,则不行。 – nils 2010-12-10 19:39:12
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: {}
我个人从不改变代码来挤压更多东西在一行上。我有三种不同的作业方式,一种是每行一种。
但是,如果通过做出这样的改变而有文件记录的性能改进,那就是另一回事了。我只是不知道这些变化带来的性能改进。只有混淆。
人们已经回答了你的问题的意图,但是......
有一个更快的方式在Python做到这一点?
你是什么意思,更快?
我认为你真正的问题应该是“这是什么pythonic方式?“
1级,级别2,级别3 = {}
元组由逗号运算(方括号内不)构造,具有或不具有括起括号,但是空元组必须包含括号,例如a,b,c或()。单个元组元组必须包含尾随逗号,如(d,)
a,b,c隐式地(a,b,c)。这就是为什么你需要像其他海报(nils,sdolan,gunner)所建议的那样在右侧有一个三元组。
明确地示出它们被暗示此:
(level1, level2, level3) = ({}, {}, {},)
*似乎创建对象*的副本 - 的代码'level1 = level2 = level3 = {}'不会创建字典的任何副本。 – 2010-12-10 18:02:13
只是一个术语nitpick,但'level1 = level2 = level3 = {}'实际上不是创建副本。如果它创建了一个副本,那么行为就是你想要的。相反,它将全部3分配给同一个对象,而不是对象的副本。 – Davy8 2010-12-10 18:04:07
@ Davy8当有人说出与他们想说的相反的意思时,我不认为这是挑剔的。 – 2010-12-10 18:24:48