在Python中初始化对象列表

bra*_*ves 13 python arrays initialization list

我正在寻找初始化非空对象的数组/列表 - 类构造函数生成数据.在C++和Java中,我会做这样的事情:

Object lst = new Object[100];
Run Code Online (Sandbox Code Playgroud)

我已经挖过了,但是有没有Pythonic方法来完成这项工作?

这不像我想的那样工作(我得到100个引用同一个对象):

lst = [Object()]*100
Run Code Online (Sandbox Code Playgroud)

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

lst = [Object() for i in range(100)]
Run Code Online (Sandbox Code Playgroud)

对于在Java中如此简单的事情,列表理解似乎(智力上)就像"很多"工作一样.

Gre*_*ill 32

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

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

lst = [Object() for i in range(100)]
Run Code Online (Sandbox Code Playgroud)

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

lst = [Object() for _ in range(100)]
Run Code Online (Sandbox Code Playgroud)

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

lst = [None] * 100
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 12

您应该注意Python的Java代码等价(创建对Object 的100个引用的数组):

Object arr = new Object[100];
Run Code Online (Sandbox Code Playgroud)

或C++代码:

Object **arr = new Object*[100];
Run Code Online (Sandbox Code Playgroud)

是:

arr = [None]*100
Run Code Online (Sandbox Code Playgroud)

不:

arr = [Object() for _ in range(100)]
Run Code Online (Sandbox Code Playgroud)

第二个与Java相同:

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

事实上,Python初始化复杂数据结构的能力远远优于Java.


注意:C++代码:

Object *arr = new Object[100];
Run Code Online (Sandbox Code Playgroud)

必须做与Python的列表理解一样多的工作:

  • 为100个对象分配连续内存

  • 为每个对象调用Object :: Object()

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