在Python中动态声明/创建列表

9

我是Python的初学者,在编写Python脚本时遇到了需要动态声明/创建一些列表的要求。我需要像这样创建4个列表对象,例如depth_1、depth_2、depth_3、depth_4,当输入为4时。

for (i = 1; i <= depth; i++)
{
    ArrayList depth_i = new ArrayList();  //or as depth_i=[] in python
}

我希望它可以动态创建列表。您能否提供解决方案?

非常感谢。

3个回答

13

你可以使用 globals() 或者 locals() 来达到你想要的目的。

>>> g = globals()
>>> for i in range(1, 5):
...     g['depth_{0}'.format(i)] = []
... 
>>> depth_1
[]
>>> depth_2
[]
>>> depth_3
[]
>>> depth_4
[]
>>> depth_5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'depth_5' is not defined

为什么不使用列表的列表?

>>> depths = [[] for i in range(4)]
>>> depths
[[], [], [], []]

谢谢。但是在使用第一种方法时,我遇到了一个错误。 g['depth_{}'.format(i)] = [] ValueError: 格式中的零长度字段名 - Cheese
@ChithraNair,我已经更新了代码,可以在Python 2.6上运行。 - falsetru
尝试打印depths_1时,它告诉我未定义变量!是的,我认为我可以使用列表的列表。 - Cheese
谢谢...是的,我也尝试了depth_1,它在红色标记中抱怨一个未定义的变量,但运行它却给出了结果!非常感谢您...顺便问一下,在这里使用全局变量是一个不好的选择吗? - Cheese
1
红色标志?你可能在使用集成开发环境(IDE)。许多IDE都无法处理以此方式创建的变量。正如其他回答所述,使用全局变量创建变量不是一个好的方法。 - falsetru
显示剩余3条评论

6
你不能在Python中实现这一点。推荐的方法是使用一个列表来存储你想要的四个列表:
>>> depth = [[]]*4
>>> depth
[[], [], [], []]

或者使用像globalslocals这样的技巧。但不要那样做。这并不是一个好选择:

>>> for i in range(4):
...     globals()['depth_{}'.format(i)] = []
>>> depth_1
[]

谢谢。但是在执行g['depth_{}'.format(i)] = []时,我遇到了以下错误:ValueError: zero length field name in format。 - Cheese
请问,为什么使用globals()不是一个好选择? - Cheese
它将在全局命名空间中注册变量。有时会导致混乱。 - zhangyangyu

5

我认为使用depth_i是有风险的,因此我不会使用它。我建议你使用以下方法代替:

depth = [[]]

for i in range(4):
    depth.append([])

现在,你只需要使用depth[1]来调用depth_1。如果可能的话,你应该从depth[0]开始。
然后,你的代码将变为depth = []

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接