Это связано с точкой, в которой d связан. Лямбда-функции все указывают на переменную d
, а не на текущее значение , поэтому, когда вы обновляете d
в следующей итерации, это обновление просматривается через все ваши функции.
Для более простого примера:
funcs = []
for x in [1,2,3]:
funcs.append(lambda: x)
for f in funcs:
print f()
# output:
3
3
3
Вы можете обойти это, добавив дополнительную функцию, например:
def makeFunc(x):
return lambda: x
funcs = []
for x in [1,2,3]:
funcs.append(makeFunc(x))
for f in funcs:
print f()
# output:
1
2
3
Вы также можете зафиксировать область видимости внутри выражения лямбда
lambda bound_x=x: bound_x
. Однако в целом это не очень хорошая практика, поскольку вы изменили подпись своей функции.
Для усечения файла независимо, если это открыто запущенным приложением, сделайте:
> /var/logs/your.log
при Вашем приглашении оболочки.
Если это будет продолжающимся беспокойством, необходимо смотреть на logrotate, поскольку он может сделать это для Вас.
я не знал приблизительно echo > file.log
, хотя это имеет смысл. Я всегда использовал cat /dev/null > file.log
.
кроме того, нужно отметить, что очень важно не удалить файл журнала, который пишется в то, потому что программа, которая имеет его открытый, продолжит писать в файл. Очень трудный выяснить, почему всего Вашего пространства на жестком диске не стало!
Из здесь :
Вы можете переместить открытый файл, а затем указать mysqld очистить журналы, что откроет новый журнал.
shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mv mysql-slow.log mysql-slow.old
shell> mysqladmin flush-logs