Понимание списка 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] 
  • фильтрация понятий списка - «ловушка set ()»
  • Почему Python IDLE Print вместо Backspace?
  • Преобразование JSON в словарь Python
  • Получить полный список всех возможных атрибутов класса
  • Как получить Python isidentifer () в Python 2.6?
  • pip3 install pyautogui не работает с кодом ошибки 1 Mac OS
  • Довольно печатать новые строки внутри строки в Pandas DataFrame
  • pygame / python sprite не перемещается? Что я сделал не так? (без ошибок)
  • Проверьте, является ли значение равным нулю или нет null в python
  • Использование QProcess.finished () в Python 3 и PyQt
  • Почему мои лямбды не работают?
  • Python - лучший язык программирования в мире.