ещё питоновых грабелек
Кто с ходу увидит ошибку?
for i in range(0,3):
test.acct_servers[i].handleAcctRequest = \
lambda p: handleAcctRequest(test, test.acct_servers[i], p)
Получившие данную шишку на лбу понимают, почему для порождения замыкания надо рисовать отдельную функцию.
UPD[2012-07-05]: от gegmopo4:
... lambda p, i=i: (далее по тексту)
Работает, но я не берусь отправлять такое в общее репо.
no subject
no subject
no subject
В первом случае всё должно работать правильно, во втором вообще не понятно что будет с i после ухода из скоупа цикла. Ну, то есть, язык с GC, ясно что будет — у всех оно получится 3.
no subject
no subject
no subject
no subject
no subject
no subject
Когда пишут фор в си-подобных языках, тоже пишут (i = 0; i < 10; i++), а не i <= 9. Всë ок, так удобно жить.
no subject
Не знаю, почему.
no subject
no subject
no subject
no subject
no subject
Если мы начинаем с 0, то индекс меньше длины. А если с 1, то меньше или равен - и начинают вылезать ошибки на 1 в разных местах. :(
Я когда-то видел статью, написанную внятнее, чем у Дейкстры, но в целом сначала думаешь "а что, прикольно", а потом все эти ошибки на 1 когда вылезут - становится совсем невесело.
Это надо сказать, что в Луа с ними проще, чем там в жс или в си - есть итераторы типа pairs/ipairs, которые вернут что надо, иначе бы циклы довольно стрëмно выглядели.
no subject
no subject
[a,a) ==> empty
[a,b) [b,c) ==> [a,c)
[a,b) [c, d) ==> [b, c)
(следствие) [a,b) [b,c) ==> empty
(следствие) a <= b <= c ==> [a,c) = [a, b) [b, c), при этом <= в левой части существенно.
С открытыми и закрытыми появляются граничные случаи в количествах.
no subject
[a,b) union [b,c) => [a,c)
[a,b) intersect [c,d) => [b,c)
[a,b) intersect [b,c) => empty
a <= b <= c ==> [a, c) = [a,b) union [b,c)
no subject
let lambas = [];
for (let i = 0; i < 10; i++) {
lambdas.push(function() { console.log(i); });
}
Это будет работать как хочется.
no subject
no subject
no subject
В кложуре всë immutable, там просто иначе никак не выйдет, так что там нормально. Итого - хаскель, окамл, кложура. Хз, что там в ерланге.
no subject
no subject
no subject
no subject
no subject
no subject
lambda p, i=i:no subject
Так что сделаем другим путём.
no subject
no subject
no subject
А что за другой путь? Чем он отличается?
no subject
no subject
no subject
no subject
range(0,3)не описка, я начинаю думать плохое.no subject
Не описка.
Что именно плохое?
no subject
range(0,3)вместо нормальногоrange(3)? Первое, что приходит в голову (и наиболее вероятное) — опечатка или артефакт редактирования. Возможен ещё вариант разумного использования, если тут же рядом в коде есть range(1,4), range(2,5), range(-1,2) и т. п., причём в широком ассортименте. Но это очень, очень редкий случай. Остаётся ещё способности и вкусы кого-то, обладающего властью (чтобы принудить к этому питонистов), — т. е. просто самодурство.no subject
То, что Вы не рассматриваете такую причину в принципе, а вместо этого придумываете какое-то "самодурство", говорит, что Вы не используете полезную экономию мышления. И это грустно.
no subject
no subject
no subject
> var a = []; for (i = 0; i < 3; i++) {a[i] = function() {console.log(i);}}; a[0]() 3