Это появилось в a recent PyCon talk.Почему допустимо назначать пустой список, но не пустой кортеж?
Заявление
[] = []
ничего не делает осмысленным, но не бросает исключение либо. У меня такое чувство, что это должно быть связано с распаковкой правил. Вы можете сделать tuple unpacking со списками тоже, например,
[a, b] = [1, 2]
делает то, что можно было бы ожидать. Как логическое следствие, это также должно работать, когда количество распакованных элементов равно 0, что объясняет, почему присвоение пустого списка является допустимым. Эта теория подтверждается также тем, что происходит, когда вы пытаетесь присвоить непустой список пустой список:
>>> [] = [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Я был бы счастлив с этим объяснением, если то же самое будет также справедливо и для кортежей. Если мы можем распаковать список с 0 элементами, мы также должны иметь возможность распаковывать кортеж с 0 элементами, нет? Однако:
>>>() =()
File "<stdin>", line 1
SyntaxError: can't assign to()
Похоже, что правила распаковки не применяются для кортежей, как для списков. Я не могу придумать никаких объяснений этой непоследовательности. Есть ли причина такого поведения?
@ozgur, но распаковка с помощью кортежей действительно работает: 'a, b = 1, 2' is valid ... –
Я не уверен, но я думаю, что' [] = [] 'не распаковывается. Однако я получил удивление, когда увидел, что это выполнимо: '[a, b] = [1, 2]'. Вместо этого я бы сделал 'a, b = (1, 2)' – ozgur
У меня такое ощущение, что здесь не будет никакого интересного принципа. Лучший ответ, вероятно, будет похож на «вот раздел генератора кода, где он проверяет правильность LHS назначения, и вот проверка, которая ловит'() ', но позволяет' [] 'through". Возможно, это будет потому, что '()' распознается как константа или что-то в этом роде. – user2357112