Это временное имя, используемое для понимания списка в 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']