Подтвердить что ты не робот

Почему создание списка из списка делает его более крупным?

Я вижу некоторые несоответствия при использовании sys.getsizeof для того, что должно быть одинаковыми списками. (Python 2.7.5)

>>> 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

Есть ли у кого-то простое объяснение?

4b9b3361

Ответ 1

С литеральным списком, виртуальная машина создает список с заданной длиной. При передаче последовательности в конструктор list() элементы добавляются один за другим (через list.extend()), и, таким образом, при необходимости размер списка изменяется. Поскольку операция изменения размера встраивается, чтобы амортизировать затраты, окончательный список обычно будет больше, чем исходный список.

Ответ 2

Когда вы создаете литерал списка, указанный размер - это минимальный размер, необходимый для хранения данных. Вы можете видеть это, потому что размер вскакивает, если вы добавляете один элемент. Однако, когда вы используете list, чтобы скопировать его, он выделяет дополнительное пространство - он принимает несколько добавлений до того, как он перераспределит (в вашем случае я подозреваю, что восьмое приложение будет делать это - ему нужно еще 4 байта на элемент). Вероятно, есть причина, по которой эти поведения распределения различны, но я не уверен, что это может быть.