Как python хранит объекты в памяти - PullRequest
0 голосов
/ 07 октября 2018

Насколько я понимаю, список - это блок смежных областей памяти, которые содержат указатели на значения элементов в памяти.Как показано ниже:

list in memory

Мой вопрос заключается в том, совпадает ли это с объектами в памяти, т. Е. Предположим, что у меня есть класс точек с методом init, реализованным какследует:

class Point: 
    def __init__(self, x, y): 
        self.x = x
        self.y = y

И я создаю новый точечный объект:

p = Point(4,6)

Будет ли указатель на p.x и указатель на p.y рядом друг с другом в памяти?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Не в общем, потому что атрибуты обычного объекта хранятся в хэш-таблице, с ключом имени атрибута.Возможны другие реализации (как в Self и некоторых реализациях Javascript), но, насколько мне известно, ни одна реализация Python в настоящее время не делает этого.

Если вы использовали кортежи, как в collections.namedtuple (реализация весьма поучительна),тогда указатели будут смежными.

0 голосов
/ 08 октября 2018

Python, то есть язык программирования, не имеет понятия о местах памяти или указателях.Так что с этой точки зрения нет ответа на ваш вопрос.На ваш вопрос можно ответить только для конкретной реализации python, например CPython .

Тем не менее, ответ будет нет для почти каждой реализации Python.Это потому, что (большинство) классов Python хранят свои атрибуты в словаре.Мы можем получить доступ к этому словарю через имя __dict__:

>>> Point(1, 2).__dict__
{'x': 1, 'y': 2}

Так как дикты должны быть эффективными и иметь время поиска O (1), они обычно реализуются как хеш-таблицы .Вероятность того, что x и y окажутся рядом друг с другом в хеш-таблице, очень мала.

Однако не все классы используют словарь для хранения атрибутов.Есть два исключения:

  • Встроенные классы, такие как словари, целые числа, строки и т. Д.
  • Классы с атрибутом __slots__

Специальная переменная класса __slots__ позволяет нам сообщить python, какие атрибуты будет иметь класс.Тогда Python выделит только достаточно памяти для хранения этих атрибутов, а попытка создать любые другие атрибуты вызовет ошибку:

class Point: 
    __slots__ = ('x', 'y')

    def __init__(self, x, y): 
        self.x = x
        self.y = y
>>> p = Point(1, 2)
>>> p.x
1
>>> p.__dict__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Point' object has no attribute '__dict__'
>>> p.z = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Point' object has no attribute 'z'

Если класс использует __slots__, гораздо более вероятно, чтовсе его атрибуты хранятся рядом друг с другом в памяти.Но это все еще не гарантия.Реализация Python может хранить атрибуты по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...