Найти - Пользователи
Полная версия: Трюк с присваиванием спискового литерала
Начало » Python для экспертов » Трюк с присваиванием спискового литерала
1
Kolyan
Дорогие питонисты, столкнулся со следующей идиомой:

>>> lst = []
>>> id(lst)
11130920
>>> lst[:] = [1,2,3]
>>> id(lst)
11130920
объясните, пожалуйста, на пальцах, какие механизмы скрыты за присвоением lst = , почему в результате объект экземпляра списка lst не изменяется? Во что “раскрывается” в этом присвоении lst?

P.S. Кстати, как правильно переводить “list literal”: “списковый литерал” или “списочный литерал”? У русскоязычного IT-сообщества есть устоявшееся мнение или нет? Яндекс выдает 1000 страниц на первый вариант, и 500 - на второй.
bialix
здесь работает inplace изменение объекта, когда меняется само содержимое объекта, а не создается новый.
физически список копируется внутрь списка lst полностью заменяя его содержимое. Поэтому сам объект остается тем же самым.

просто lst – это получение полной копии списка.

погуглив нашел, что list literal – это из перла. выбросьте его из головы. В питоне – просто списки и срезы.
Kolyan
Да, действительно, как гласит справочное руководство по языку (http://docs.python.org/ref/assignment.html), при присваивании срезу действуют особенные правила:

If the target is a slicing: The primary expression in the reference is evaluated. It should yield a mutable sequence object (such as a list). The assigned object should be a sequence object of the same type. Next, the lower and upper bound expressions are evaluated, insofar they are present; defaults are zero and the sequence's length. The bounds should evaluate to (small) integers. If either bound is negative, the sequence's length is added to it. The resulting bounds are clipped to lie between zero and the sequence's length, inclusive. Finally, the sequence object is asked to replace the slice with the items of the assigned sequence. The length of the slice may be different from the length of the assigned sequence, thus changing the length of the target sequence, if the object allows it.
Меня поначалу смутила левая часть присваивания - lst - дескать, как тут задействовано дублирование списка. А тут, как оказывается, никакого дублирования списка конструкция lst (в данном контексте присваивания) не вызывает.

Насчет ‘list literal’ позволю с вами не согласиться. Насколько я понимаю, термин “литерал” присутствует в каждом языке программирования. Литерал - это нотация для представления в языке программирования значения определенного типа. То есть, к примеру, все нижеперечисленное:

5 (число)
“abc” (строка)
(список)
lambda x: x*x (функция)

представляет значения различных типов, и следовательно, каждая из нотаций для представления значений является литералом. Для последнего из перечисленных, кстати, тоже есть устоявшееся название - функциональный литерал. Литералы обусловлены наличием в языке специфичных нотаций для выражения значений. К примеру:

list(1,2,3) - определение списка с помощью обычной нотации вызова подпрограмм (это - не списковый литерал, нотация не специфична)
- определение списка с помощью специфичной нотации для определения списков

Так что вопрос о правильности перевода остается открытым ;)
bialix
literal – это буквально банальная константа. В питоне нет констант.
Александр Кошелев
Чего тут спорить?
Список литералов:
http://docs.python.org/ref/atom-literals.html
Листа там нет. Зато он есть тут:
http://docs.python.org/ref/lists.html
List displays
ods
Daevaorn
Чего тут спорить?
Список литералов:
http://docs.python.org/ref/atom-literals.html
Листа там нет. Зато он есть тут:
http://docs.python.org/ref/lists.html
List displays
Если верить Wikipedia, то literal - это “Any notation for representing a value within programming language source code; for example, an object literal, string literal, or function literal.”. То, что в EBNF синтаксиса питона называется literal, на самом деле является atom (=неделимый) literal.
bialix
если верить той же википедиа, то в питоне function literal нету.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB