LINUX.ORG.RU

(уупс..)

чему должно быть равно выражение:

>>> l=list('lambda')
>>> [l.remove(i) or i for i in l]

anonymous
()
Ответ на: комментарий от anonymous

Скорее всего оно ничему ничего не должно. Результат зависит от реализации списков и [... for ... in ...], что не должно быть стандартизировано IMO.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

то есть по-вашему это нормально что в языке существуют констркуции, значение которых определяется конкретной реализацией?

(я не беру в расчет ситуацию когда результат выполнения зависит от внешних обстоятельств, как например многопоточность)

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

anonymous
()
Ответ на: комментарий от anonymous

вполне все разумно. и спокойно проверяется в голове.

l.remove(i) возвращает None. но удаляет элемент из списка. а значение i высчитывается на для каждой итерации из модифицированного списка l. поэтому каждый второй символ будет съеден.

ananas ★★★★★
()
Ответ на: комментарий от ananas

> а значение i высчитывается на для каждой итерации из модифицированного списка l

как раз вот это совершенно неочевидно, если не знать деталей реализации.

anonymous
()
Ответ на: комментарий от anonymous

http://python.org/doc/2.4/tut/node6.html#SECTION006200000000000000000

The for statement in Python differs a bit from what you may be used to in C or Pascal. Rather than always iterating over an arithmetic progression of numbers (like in Pascal), or giving the user the ability to define both the iteration step and halting condition (as C), Python's for statement iterates over the items of any sequence (a list or a string), in the order that they appear in the sequence. For example (no pun intended):

>>> # Measure some strings: ... a = ['cat', 'window', 'defenestrate'] >>> for x in a: ... print x, len(x) ... cat 3 window 6 defenestrate 12

It is not safe to modify the sequence being iterated over in the loop (this can only happen for mutable sequence types, such as lists). If you need to modify the list you are iterating over (for example, to duplicate selected items) you must iterate over a copy. The slice notation makes this particularly convenient:

>>> for x in a[:]: # make a slice copy of the entire list ... if len(x) > 6: a.insert(0, x) ... >>> a ['defenestrate', 'cat', 'window', 'defenestrate']

imho, этого достаточно, чтобы более-менее прогнозировать результаты. по крайней мере, на таких простых примерах

ananas ★★★★★
()
Ответ на: комментарий от anonymous

>что в языке существуют констркуции, значение которых определяется конкретной реализацией?

А почему нет? IMO такая бяка присуща всем языкам, допускающим побочные эффекты. Т.о. почти всем.

>мне кажется такие вещи должны быть либо разумно определены , либо запрещены

Таки да, побочные эффекты должны быть запрещены :-) На худой конец тщательно спрятаны.

DonkeyHot ★★★★★
()
Ответ на: комментарий от ananas

ну да, это я читал.

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

мне кажется в таком случае должны быть удалены все элементы списка. по крайней мере этот результат инвариантен относительно перестановки последовательности действий.

anonymous
()
Ответ на: комментарий от anonymous

сказано же - not safe to modify the sequence being iterated over in the loop

соответственно в вашем примере - хак, и определять его поведение в общем случае бессмысленно. можно рассматривать только конкретные примеры.

>>> [l.remove(i) or i for i in l[:]]

сработает как надо (пустой l и результирующий ['l','a','m','b','d','a'])

ananas ★★★★★
()
Ответ на: комментарий от anonymous

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

А как определить "разумное" для list().insert? А для list()[a:b]=list(x) при разных значениях x? Для dict-ов в каждом из случаев применения? Мысль понятна?

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

DonkeyHot ★★★★★
()

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

anonymous
()
Ответ на: комментарий от anonymous

2 ошибочных утверждения.

1. Питон и Си - существенно разные "говна".

2. бессмысленность попыток доказательства безглючности кода зависит не от языка а от того, как им пользуются.

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.