我正在寻找初始化非空对象的数组/列表 - 类构造函数生成数据。在C ++和Java中,我会做这样的事情:
Object lst = new Object[100];
我已经挖过了,但有没有Pythonic的方法来完成这件事?
这不像我想象的那样(我得到100个引用同一个对象):
lst = [Object()]*100
但这似乎以我想要的方式奏效:
lst = [Object() for i in range(100)]
列表理解似乎(智力上)像“很多”工作一样,在Java中如此简单。
答案 0 :(得分:31)
没有办法为C ++中的每个元素元素隐式调用Object()
构造函数(回想一下,在Java中,新数组的每个元素都初始化为null
参考类型)。
我会说你的列表理解方法是最Pythonic:
lst = [Object() for i in range(100)]
如果你不想踩到词法变量i
,那么Python中的一个约定是使用_
作为一个虚拟变量,其值无关紧要:
lst = [Object() for _ in range(100)]
对于Java中类似的构造,您当然可以使用*
:
lst = [None] * 100
答案 1 :(得分:12)
你应该注意到Python的Java代码是等价的 (创建100个 null 对Object的引用数组):
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();
}
事实上,Python初始化复杂数据结构的能力远远优于Java。
注意: C ++代码:
Object *arr = new Object[100];
必须做与Python的列表理解一样多的工作:
为100个对象分配连续内存
为每个对象调用Object :: Object()
结果将是一个完全不同的数据结构。
答案 2 :(得分:2)
我认为列表理解是最简单的方法,但是,如果你不喜欢它,它显然不是获得你想要的唯一方法 - 调用给定的可调用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不会将这一个案例单独用于特殊和怪异的处理,但处理与其他类似用例一样常规和轻松! - )
答案 3 :(得分:0)
lst = [Object() for i in range(100)]
由于数组是python中自己的第一个类对象,我认为这是获取所需内容的唯一方法。 *做了一些疯狂的事。