Понимание списка Python с именами фиктивных имен, идентичными имени итератора: не рекомендуется?

Скажем, я делаю список, который выглядит примерно так:

i = range(5) a = [f(i) for i in i] 

для некоторой функции f . Будет ли использование фиктивного имени, идентичного итератору, когда-либо давать неожиданные результаты? Иногда у меня есть имена переменных, которые являются отдельными буквами, и для меня более читаемо придерживаться той же буквы, а не назначать новую, например [f(x) for x in x] вместо [f(i) for i in x] (например, если буква итератора x имеет смысл , я задаюсь вопросом, что такое heck i ).

2 Solutions collect form web for “Понимание списка Python с именами фиктивных имен, идентичными имени итератора: не рекомендуется?”

TL; DR: Это безопасно, технически, но это бедный выбор стилистически.

В понимании списка, прежде чем связывать свободную переменную for-loop с любым объектом, Python будет использовать код операции GET_ITER на итерабельном, чтобы получить итератор. Это делается только один раз в начале цикла.

Поэтому в теле «цикла» понимания списка (который фактически создает область действия в Python 3), вы можете переписать имя, которое первоначально указывало на iterable без каких-либо последствий. Итерация напрямую связана с ссылкой на итератор , и независимо от того, имеет ли оно имя в области, не имеет значения. То же самое должно выполняться в Python 2, хотя детали реализации области обзора различны: имя коллекции будет потеряно после понимания, так как имя переменной цикла будет привязано к окончательному элементу итерации.

Нет никакого преимущества писать код таким образом, и он менее читабельен, чем просто избегать столкновения имен. Итак, вы должны предпочесть назвать коллекцию, чтобы было более очевидно, что это коллекция:

 [f(x) for x in xs] 

В то время как вы можете избежать использования повторяющихся имен переменных из-за того, как Python выполняет проверки списков – даже вложенные списки – не делайте этого . По вашему мнению, это может показаться более читаемым, но для большинства людей это будет очень запутанным.

Однако это приводит к гораздо более важному вопросу. Зачем использовать имя типа i , j или x вообще? Использование одноименных имен переменных вызывает путаницу и неоднозначно. Вместо этого используйте имя переменной, которое четко передает ваши намерения.

Или, если у вас нет необходимости в значениях в итерации, выполняемой путем повторения (например, вы просто хотите повторить блок кода определенное количество раз), используйте переменную «throw-away», _ , чтобы донести до читателя вашего кода, что значение не важно и его следует игнорировать.

Но не используйте не описательные, повторяющиеся, однобуквенные имена переменных. Это будет только путать будущих читателей вашего кода, сделать ваше намерение непонятным и создать код, который трудно поддерживать и отлаживать.

Потому что, в конце концов, лучше бы вы сохранили такой код

 [str(x) for x in x] 

или это?

 [str(user_id) for user_id in user_ids] 
  • UnicodeEncodeError: кодек «mbcs» не может кодировать символы в позиции 0-1: недопустимый символ при запуске скрипта, скомпилированного PyInstaller
  • Использовать класс в контексте другого модуля
  • преобразовать фрейм данных python в список
  • Почему модуль tkinter повышает ошибку атрибута при запуске через командную строку, но не при запуске через IDLE?
  • Распечатайте все, что можно импортировать
  • Руководство по использованию Concurrent.futures - простой пример использования потоков и обработки
  • Изменение доходности от возвращаемого значения
  • Почему monkeypatch python не работает при импорте класса вместо модуля?
  • Python - лучший язык программирования в мире.