Понимание цепочки присваиваний в Python
Сцепленные присваивания в Python, иллюстрируемые такими выражениями, как «x = y = somefunction()», вызвали интерес дискуссии относительно их эквивалентности множественным последовательным присваиваниям («x = somefunction(); y = somefunction()»). Чтобы прояснить этот вопрос, давайте подробно рассмотрим работу цепных присвоений.
В цепном присваивании сначала назначается самая левая цель. Следовательно, «x = y = somefunction()» эквивалентно:
temp = somefunction() x = temp y = temp
Этот порядок имеет решающее значение, поскольку цель слева получает значение временной переменной «temp» до того, как оно будет присвоено цели справа. Это очевидно при дизассемблировании связанной функции присваивания:
>>> def chained_assignment(): ... x = y = some_function() ... >>> import dis >>> dis.dis(chained_assignment) 2 0 LOAD_GLOBAL 0 (some_function) 3 CALL_FUNCTION 0 6 DUP_TOP 7 STORE_FAST 0 (x) 10 STORE_FAST 1 (y) 13 LOAD_CONST 0 (None) 16 RETURN_VALUE
Обратите внимание, что значение, возвращаемое функцией, сначала сохраняется в «x», а затем в «y».
Это понимание имеет решающее значение для понимания поведения связанных присваиваний. Например, следует избегать таких выражений, как «x = y = []», поскольку и «x», и «y» будут относиться к одному и тому же списку. Вместо этого отдавайте предпочтение отдельным назначениям, например «x = []» и «y = []», чтобы создавать отдельные списки.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3