Python: ключи в словаре также рассматриваются как переменные? - PullRequest
0 голосов
/ 06 мая 2018

Я только недавно начал изучать программирование на python как новичок. Мне было интересно: ключи в словаре также рассматриваются как переменные?

students = {"Jake": 12, "Rachel":12, "Ross":15}

код содержит имена учеников и их возраст. Например: «Jake» - это переменная, которая содержит значение 12? или это рассматривается как переменная?

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Хотя вы можете использовать именованное значение (или то, что вы можете считать «переменной») для создания словаря:

>>> x=22
>>> di={x:x}
>>> di
{22: 22}

Вы также можете продемонстрировать, что значение именованного значения (если это значение является неизменным) используется во время построения, а не динамически:

>>> x=5
>>> di
{22: 22}

Ключи для dict должны быть хешируемыми (то есть неизменяемыми; неизменяемыми), что исключает использование списка, набора или другого именованного значения, которое может измениться:

>>> changeable_list=[22]
>>> di={changeable_list:changeable_list}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

Но значение dict может быть динамическим и изменяемым:

>>> di={tuple(changeable_list):changeable_list}
>>> di
{(22,): [22]}

И этот список можно изменить:

>>> changeable_list.append(44)
>>> changeable_list
[22, 44]
>>> di
{(22,): [22, 44]}

Обратите внимание, как изменяется значение dict при изменении списка, потому что это один и тот же объект.

0 голосов
/ 06 мая 2018

TL; DR - это зависит от того, что вы подразумеваете под «переменной». dicts действуют как пространства имен python, но допускают больше типов имен переменных.

Объекты Python не имеют собственного имени. На них могут ссылаться один или несколько других объектов, и когда их счетчик ссылок становится равным нулю, они удаляются. Когда вы назначаете объект переменной, некоторая структура данных добавляет ссылку на объект и связывает этот объект с именем. Эта структура данных является пространством имен переменной (то есть контекстом, в котором имя переменной является допустимым). И для большинства объектов эта структура данных представляет собой dict.

Давайте рассмотрим два примера:

class Students:
    pass

student_obj = Students()

и

student_dct = {}

Я мог бы рассматривать Джейка как переменную

>>> student_obj.Jake = 12
>>> student_obj.Jake
12
>>> student_obj.__dict__
{'Jake': 12}

Или добавьте его к диктату

>>> student_dct["Jake"] = 12
>>> student_dct["Jake"]
12
>>> student_dct
{'Jake': 12}

Это действительно близко к первому примеру! Преимущество переменной в том, что она анализируется python, и python выполняет поиск за вас. Питон превращает student_obj.Jake в student_obj.__getattribute__("Jake"). Для обычных объектов класса python проверит имя объекта __dict__, а затем вернется к пространствам имен. Классы, которые используют __slots__ или реализованы в C, следуют другим правилам.

Но назначение переменных является недостатком, если вы хотите использовать имена, которые не соответствуют правилам синтаксиса python.

>>> student_obj.Jim Bob = 12
  File "<stdin>", line 1
    student_obj.Jim Bob = 12
                      ^
SyntaxError: invalid syntax

Здесь вы хотите, чтобы «Jim Bob» был переменной, но его нельзя использовать непосредственно как переменную, потому что он нарушает python. Итак, вы положили его в диктат

>>> student_dct["Jim Bob"] = 12

Таким образом, элементы словаря являются «переменными» (на значение можно ссылаться и переназначать), но не являются «переменными python», потому что python не реализует поиск для вас.

0 голосов
/ 06 мая 2018

Как уже было сказано, нет, ключи словаря не являются переменными. Однако иногда переменные могут восприниматься как ключи:

students = {"Jake": 12, "Rachel":12, "Ross":15}

class Students:
    pass

s = Students()
s.Jake = 12
print(s.Jake, students['Jake'])

print(getattr(s, 'Jake'))

Выход:

12 12
12

Я не знаю синтаксиса, который позволил бы вам получить доступ к значению 12 из students в этой форме: students.Jake

Однако измените приведенный выше код:

class Students:
    def __getitem__(self, key):
        return getattr(self, key)

... # as before
print(getattr(s, 'Jake'), s['Jake'])

Выход:

12 12

Теперь у студентов есть оператор [], немного похожий на словарь (другие операторы также могут быть необходимы.)

Итак, объект может стать похожим на словарь, потому что у него есть базовый словарь, который заставляет их работать как объекты.

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