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 не реализует поиск для вас.