例如,我想要一个看起来像这样的列表:[1, 1, 1, 1, 1]
。
我可以创建它:
l = [1, 1, 1, 1, 1]
或者我可以将一个仅包含元素的单个列表重复5次:
l = [1] * 5
或者我可以使用列表理解:
l = [1 for i in range(5)]
在这三种方式中,哪种是最快的最佳实践?
我以某种方式还记得第二种方法是有问题的,因为列表中的每个位置将包含相同的内存地址,因此更新一个索引将导致列表中的所有元素都更新为相同的值。但是,经过修改后,情况似乎并非如此。
答案 0 :(得分:0)
可变对象的两种更好的情况:
import copy
class A:
def __init__(self, value):
self.value = value
_LEN_OF_LIST = 5
# object could be created quickly
l = [A(value=100500) for i in range(_LEN_OF_LIST)]
# creating of object is expensive operation
default_object = A(value=100500) # mutable object which
l = [copy.deepcopy(default_object) for i in range(_LEN_OF_LIST)]
# addresses
print('\r\n'.join([str(obj) for obj in l]))
输出:
<__main__.A object at 0x0000028A9BD45B00>
<__main__.A object at 0x0000028A9BC17EB8>
<__main__.A object at 0x0000028A9BC17AC8>
<__main__.A object at 0x0000028A9BC17B38>
<__main__.A object at 0x0000028A9BC17DA0>
如您所见:每个对象在内存中都有自己的地址