Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么从列表创建一个列表会使它变大?_Python_List_Python Internals - Fatal编程技术网

Python 为什么从列表创建一个列表会使它变大?

Python 为什么从列表创建一个列表会使它变大?,python,list,python-internals,Python,List,Python Internals,在应该相同的列表上使用sys.getsizeof时,我发现了一些不一致之处。(Python 2.7.5) 有人有简单的解释吗?创建列表文字时,报告的大小是保存数据所需的最小大小。您可以看到这一点,因为如果添加单个元素,则大小会增加。但是,当您使用list来复制它时,它会分配一些额外的空间-在重新分配之前需要几个追加(在您的情况下,我怀疑第8个追加可以做到这一点-每个元素还需要4个字节)。这些分配行为的不同可能是有原因的,但我不确定这可能是什么。使用列表文字,VM创建具有设置长度的列表。将序列传递

在应该相同的列表上使用
sys.getsizeof
时,我发现了一些不一致之处。(Python 2.7.5)


有人有简单的解释吗?

创建列表文字时,报告的大小是保存数据所需的最小大小。您可以看到这一点,因为如果添加单个元素,则大小会增加。但是,当您使用
list
来复制它时,它会分配一些额外的空间-在重新分配之前需要几个追加(在您的情况下,我怀疑第8个追加可以做到这一点-每个元素还需要4个字节)。这些分配行为的不同可能是有原因的,但我不确定这可能是什么。

使用列表文字,VM创建具有设置长度的列表。将序列传递给
list()
构造函数时,会逐个(通过)添加元素,因此会在适当时调整列表的大小。由于超额分配是为了分摊成本,最终列表通常会比源列表大。

我有一个猜测,没有任何证据支持:列表提前分配额外内存,因此未来的
append
操作会分摊O(1)复杂性。大小的差异可能是因为额外分配的内存量不同。@Kevin,使用
lst2=lst[:]
返回相同的大小可能是正确的。对于建议
append
,这对深入了解内部结构非常有帮助。请您进一步解释以下内容好吗?由于调整大小操作为了分摊成本而过度分配,最终列表通常会比源列表大,谢谢@卡斯拉:如果您添加3个空格,但只填充其中1个,那么目标将比源多2个空格。@IgnacioVazquez Abrams那么如果我们要填充4个空格呢?我是说python是如何完成这项危险的任务的?@Kasra:一旦第四个空间需要填充,就会额外分配4个空间(假设地说),从而导致4/7的使用率。@IgnacioVazquez Abrams ahan。。。为了重播,我需要更多的搜索!
>>> lst = [0,1,2,3,4,5,6,7,8,9]
>>> sys.getsizeof(lst)
76
>>> lst2 = list(lst)
>>> sys.getsizeof(lst2)
104
>>> lst3 = list(lst2)
>>> sys.getsizeof(lst3)
104
>>> sys.getsizeof(lst[:])
76
>>> sys.getsizeof(lst2[:])
76