Что означает locals () '] в Python?

Я видел один код liner, который, как утверждается, удаляет дубликаты из последовательности :

u = [x for x in seq if x not in locals()['_[1]']] 

Я пробовал этот код в ipython (с Python 2.7), он дал KeyError: '_[1]'

Значит ли ['_[1]'] что-то особенное в Python?

4 Solutions collect form web for “Что означает locals () '] в Python?”

locals()['_[1]'] – это способ доступа к текущему результату ссылки на список (или генератор) в этом понимании списка.

Это довольно зло, но может привести к смешным результатам:

 >> [list(locals()['_[1]']) for x in range(3)] [[], [[]], [[], [[]]]] 

Подробнее см. Здесь: «секретные имена» .

Это временное имя, используемое в понимании списка Python 2.6 и ранее. Python 2.7 и Python 3.x исправили эту бородавку: создаваемый список больше не доступен до завершения создания.

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

Здесь вы можете видеть, что Python 2.7 оставляет locals() неизменным, в то время как Python 2.6 создает короткую живую временную:

 Python 2.7.2 (default, Jan 5 2012, 16:24:09) [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def foo(): t = [list(locals().keys()) for x in range(1) ] print(locals()) print(t[0]) >>> foo() {'x': 0, 't': [['x']]} ['x'] >>> Python 2.6.7 (r267:88850, Jan 5 2012, 16:18:48) [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def foo(): t = [list(locals().keys()) for x in range(1) ] print(locals()) print(t[0]) >>> foo() {'x': 0, 't': [['_[1]', 'x']]} ['_[1]', 'x'] >>> 

Python 3.x вводит новый короткий промежуточный временный список, который называется .0 . Не поддавайтесь соблазну использовать это для чего угодно. Кроме того, полное описание списка выполняется в отдельном пространстве имен, поэтому переменные цикла не доступны вне цикла:

 Python 3.2 (r32:88445, Jan 5 2012, 16:29:57) [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> def foo(): t = [list(locals().keys()) for x in range(1) ] print(locals()) print(t[0]) >>> foo() {'t': [['.0', 'x']]} ['.0', 'x'] 

Вау! Это скверный код. Взял немного исследований, чтобы найти ответ.

По существу, понимание списка – это создание нового списка. Он называет этот временный список _[1] . Часть locals() использует словарь locals() для поиска этого имени, поскольку он недоступен в противном случае. Так что эта строка говорит …

 [x for x in seq if x not in this_list] 

Cryptic.

Найденная информация об этом здесь

locals() из документов Python:

Обновите и верните словарь, представляющий текущую локальную таблицу символов. Свободные переменные возвращаются locals (), когда они вызываются в функциональных блоках, но не в блоках классов.

Я не могу понять, почему locals() используется в одном слое, возможно, это не так, как вам нужно.

Если вы пытаетесь удалить дубликаты из списка, я думаю, что лучший выбор – преобразовать его в set :

 In [2]: l = [1,1,3,4,2,4,6] In [4]: set(l) Out[4]: set([1, 2, 3, 4, 6]) 

Если вам нужен список еще раз:

 In [5]: list(set(l)) Out[5]: [1, 2, 3, 4, 6] 
  • Найдите пересечение двух списков?
  • python получает значения словаря в списках
  • Добавьте элемент между каждым элементом, уже находящимся в списке
  • Разделение на последний разделитель в строке Python?
  • Как преобразовать строку с разделителями-запятыми в список в Python?
  • Список с дублирующимися значениями и суффикс
  • Что делает эта нотация для списков в Python: «someList »?
  • Безопасная функция max () для пустых списков
  • Пользовательский метод сортировки в Python не сортирует список правильно
  • Python найти объект в списке
  • самый умный способ объединения двух списков в форматированную строку
  • Python - лучший язык программирования в мире.