Ответ 1
Согласно Issue23275, это в основном причуды, не причиняющие никакого реального вреда, но также и никакой полезности. Обратите внимание, что [] =()
не изменяет литерал list
:
>>> [] = ()
>>> type([])
<class 'list'>
[] = x
операторы [] = x
основном утверждают, что x
является итерабельным и что x
пуст (хотя никто не рекомендовал бы их использовать таким образом), например
>>> [] = (1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> [] = (1,)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Как замечает Джон Й, лучше всего думать о [] =()
как не о назначении, а как о совместимости с синтаксисом распаковки Python.
Как отмечает ArrowCase, этот синтаксис также распространяется на несколько присвоений:
>>> a = [] = ()
>>> a
()
Глядя на байт-код CPython для множественного назначения, показано, что эти операции похожи на обычный итеративный синтаксис распаковки, используя инструкцию UNPACK_SEQUENCE
:
>>> dis.dis('a = [] = ()')
1 0 BUILD_TUPLE 0
2 DUP_TOP
4 STORE_NAME 0 (a)
6 UNPACK_SEQUENCE 0
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
>>> dis.dis('[a, b] = (1, 2)')
1 0 LOAD_CONST 3 ((1, 2))
2 UNPACK_SEQUENCE 2
4 STORE_NAME 0 (a)
6 STORE_NAME 1 (b)
8 LOAD_CONST 2 (None)
10 RETURN_VALUE
Тот же Issue23275 утверждает, что () =()
был добавлен как допустимый синтаксис для Python 3 для согласования. Было решено, что удаление [] =()
будет бесполезным сломать код, так как оно не наносит вреда и подходит с итерируемой логикой распаковки. {} =()
по-прежнему недействителен, поскольку синтаксис распаковки не имеет смысла в этом контексте с фигурными скобками.
В случае, если кому-то интересно, синтаксис вроде list() =()
просто синтаксически недействителен, потому что вы никогда не сможете назначить вызов функции.