我一看到一系列初始化/清单的目的,不是空洞的--的类的构造产生的数据。在C++、Java我会做这样的事情:

Object lst = new Object[100];

我已经挖左右,但是有一个功能已大大增强的方式来获得这样做?

这并不像我想的那样(I获得100引用相同的对象):

lst = [Object()]*100

但是,这似乎是工作我想要的方式:

lst = [Object() for i in range(100)]

名单的理解似乎(智力),如"大量"的工作为什么这这么简单。

有帮助吗?

解决方案

没有办法隐式调用数组中每个元素的 Object()构造函数,就像在C ++中一样(回想一下,在Java中,新数组的每个元素都被初始化为参考类型的 null

我会说你的列表理解方法是最Pythonic:

lst = [Object() for i in range(100)]

如果你不想踩到词汇变量 i ,那么Python中的一个约定就是使用 _ 来表示一个虚拟变量,其值无关紧要:

lst = [Object() for _ in range(100)]

对于Java中类似的构造,您当然可以使用 *

lst = [None] * 100

其他提示

你应该注意的是蟒蛇的equvalent Java码 (创造阵列的100 引用对象):

Object arr = new Object[100];

或C++编码:

Object **arr = new Object*[100];

为:

arr = [None]*100

不:

arr = [Object() for _ in range(100)]

第二是相同Java:

Object arr = new Object[100];
for (int i = 0; i < arr.lenght; i++) {
    arr[i] = new Object();
}

事实上蟒蛇的能力的初始化复杂的数据结构是远远更好的然后Java。


注:C++编码:

Object *arr = new Object[100];

必须做多少工作Python列理解:

  • 分配持续存储器,用于100个对象

  • 电话对象::Object()对于每个这样的对象

结果将是一个完全不同的数据结构。

我认为列表理解是最简单的方法,但是,如果你不喜欢它,它显然不是获得你想要的唯一方法 - 调用给定的可调用100次而没有参数来形成100个项目一个新的清单。例如, itertools 显然可以这样做:

>>> import itertools as it
>>> lst = list(it.starmap(Object, it.repeat((), 100)))

或者,如果你真的是传统主义者, map apply

>>> lst = map(apply, 100*[Object], 100*[()])

请注意,这基本上是相同的(微小的,在概念上和实际上;-)如果不需要在没有参数的情况下调用,则需要调用 Object 一个参数 - 或者说,如果 Object 实际上是一个函数而不是一个类型。

出乎意料的是,它可能需要“和列表理解一样多”。为了执行这项任务,你似乎认为每种语言都应该特殊 - 需要执行“调用类型,不带参数”。关于其他类型的调用过度调用,但我没有看到对于这个非常具体的案例有什么如此重要和特殊的事情,要保证与其他案件区别对待;因此,我个人非常高兴Python不会将这一个案例单独用于特殊和怪异的处理,但处理与其他类似用例一样常规和轻松! - )

lst = [Object() for i in range(100)]

由于数组是python中自己的第一个类对象,我认为这是获取所需内容的唯一方法。 *做了一些疯狂的事。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top