Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2007 19:02:53

Kolyan
От:
Зарегистрирован: 2007-05-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

Дорогие питонисты, столкнулся со следующей идиомой:

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

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



Офлайн

#2 Дек. 7, 2007 00:40:28

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

здесь работает inplace изменение объекта, когда меняется само содержимое объекта, а не создается новый.
физически список копируется внутрь списка lst полностью заменяя его содержимое. Поэтому сам объект остается тем же самым.

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

погуглив нашел, что list literal – это из перла. выбросьте его из головы. В питоне – просто списки и срезы.



Офлайн

#3 Дек. 7, 2007 17:05:26

Kolyan
От:
Зарегистрирован: 2007-05-24
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

Да, действительно, как гласит справочное руководство по языку (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) - определение списка с помощью обычной нотации вызова подпрограмм (это - не списковый литерал, нотация не специфична)
- определение списка с помощью специфичной нотации для определения списков

Так что вопрос о правильности перевода остается открытым ;)



Офлайн

#4 Дек. 7, 2007 21:50:30

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

literal – это буквально банальная константа. В питоне нет констант.



Офлайн

#5 Дек. 7, 2007 22:00:15

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

Чего тут спорить?
Список литералов:
http://docs.python.org/ref/atom-literals.html
Листа там нет. Зато он есть тут:
http://docs.python.org/ref/lists.html
List displays



Офлайн

#6 Дек. 13, 2007 12:26:31

ods
От:
Зарегистрирован: 2007-03-03
Сообщения: 47
Репутация: +  0  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

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.



Офлайн

#7 Дек. 13, 2007 21:12:39

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Трюк с присваиванием спискового литерала

если верить той же википедиа, то в питоне function literal нету.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version