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()
结果将是一个完全不同的数据结构.