определение переменной в Python
Недавно заметил в Python что определять переменную можно другим способом:
name: str = "Bob"
Так вот чем это определение отличается от такой:
name = "Bob"
Ответы (1 шт):
По сути ничем:
Вы можете менять им значения на другие типы (что не рекомендуется):
name: str = "Bob" name = 10Или даже так:
name: str = "Bob" name: int = 1 + 1Никакой особой разницы между переменной инициализированной "по-старинке" и "модерново" нет. С ними работают одни и те же питоновские приемы.
UPD
Между прочим,
name: int = "wtf"тоже вполне работает – andreymal 4 часа назад
Единственная разница:
- Хорошо для таких вещей как mypy, pylint etc.
- На уровне дизассемблера (у меня version 3.8):
>>> dis("a: int = 10")
1 0 SETUP_ANNOTATIONS
2 LOAD_CONST 0 (10)
4 STORE_NAME 0 (a)
6 LOAD_NAME 1 (int)
8 LOAD_NAME 2 (__annotations__)
10 LOAD_CONST 1 ('a')
12 STORE_SUBSCR
14 LOAD_CONST 2 (None)
16 RETURN_VALUE
vs.
>>> dis("a = 10")
1 0 LOAD_CONST 0 (10)
2 STORE_NAME 0 (a)
4 LOAD_CONST 1 (None)
6 RETURN_VALUE
Dis Explanation
SETUP_ANNOTATIONS— "настройка аннотаций" т.е. "байткод говорит: тут мы юзаем аннотация"2 LOAD_CONST 0 (10)— подгружаем константу 10.4 STORE_NAME 0 (a)— сохраняем в а, то что подгрузили.А вот тут самое интересное:
6 LOAD_NAME 1 (int)— загружаем инт8 LOAD_NAME 2 (__annotations__)— загружаем__annotations__это по сути словарь в котором хранятся типы переменных. На пример:a: str = "";print(__annotations__)даст на стдауте{'a': <class 'str'>}10 LOAD_CONST 1 ('a') #it is clear, ain't it12 STORE_SUBSCR:STORE_SUBSCR
Implements TOS1[TOS] = TOS2 (docs)-
14 LOAD_CONST 2 (None) 16 RETURN_VALUE=
return None # functions return None automatically if you don't use any return in itЭта штука ничего не возвращает т.е. None