Почему повторное назначение __builtins __. Dict не влияет на создание новых объектов словаря?

Одноклассник задал вопрос о перезаписи встроенного класса dict , и после некоторого возни я стал еще более неуверенным.

Возьми встроенный дикт. Я могу назначить эту переменную:

>>> dict=5
>>> dict
5

Теперь я потерял доступ к dict (будет ли это теневым копированием, как в C ++ или по-другому?), но у меня все еще есть доступ к классу через builtins .dict. Но я могу переписать это также:

>>> __builtins__.dict = 6
>>> __builtins__.dict
6

Но даже это не нарушает сам класс:

>>> stillDict = {'key': 'value'}
>>> stillDict
{'key': 'value'}

Так почему же класс все еще "работает" после того, как я его скрыл? Как переводчик узнает, что я создаю словарь с этим назначением, и как составляется словарь, поскольку он, очевидно, фактически не требует __builtins__.dict?

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

перед перезаписью я могу сделать это:

>>> a = dict()
>>> a.items
<built-in method items of dict object at 0x0000000002C97C08>

после перезаписи dict и __builtins__.dict я могу сделать это:

>>> b = {}
>>> b.items
<built-in method items of dict object at 0x000000000288FC88>

Что приводит к продолжению ... Оба они все еще являются «объектами dict». Является ли класс dict просто конструктором для создания объекта dict? Почему у меня все еще есть доступ к встроенным методам после того, как я затенял класс?

7 голосов | спросил Daniel B. 20 MaramSun, 20 Mar 2016 02:24:30 +03002016-03-20T02:24:30+03:0002 2016, 02:24:30

1 ответ


0

{'key': 'value'} является литералом словаря, поэтому он продолжает создавать словарь. Python не должен искать, что означает dict - он пропускает этот шаг и напрямую генерирует байт-код для создания словаря:

>>> def f(): {'a': 3}
>>> import dis
>>> dis.dis(f)
  1           0 BUILD_MAP                1
              3 LOAD_CONST               1 (3)
              6 LOAD_CONST               2 ('a')
              9 STORE_MAP
             10 POP_TOP
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE

В байт-коде он продолжает использовать BUILD_MAP, как и раньше (т.е. он строит карту /словарь на основе кода, который вы ' мы написали).

Значение dict изменилось, как вы упомянули.


Что касается последующего вопроса: вы не скрывали класс /тип словаря - вы только изменили значение того, что dict означает. Вы не можете убрать тип словаря, и Python создает его при использовании словарного словаря (например, {}).

Если у вас есть объект типа dict, у вас есть доступ к его методам (например, items()) - просто вы создали его, используя синтаксис (на который вы не можете повлиять), а не вызов dict() (на который вы можете повлиять).

ответил Simeon Visser 20 MaramSun, 20 Mar 2016 02:31:18 +03002016-03-20T02:31:18+03:0002 2016, 02:31:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132