Ну, причина в том, что привязки выполняются при выполнении кода, и выполняется определение функции, ну ... когда функции определены.
Сравните это:
class BananaBunch:
bananas = []
def addBanana(self, banana):
self.bananas.append(banana)
Этот код страдает от такого же неожиданного случая. bananas - это атрибут класса, и, следовательно, когда вы добавляете к нему вещи, он добавляется ко всем экземплярам этого класса. Причина в том, что это точно то же самое.
Это просто «Как это работает», и заставить его работать по-другому в функциональном случае, вероятно, будет сложно, а в случае класса вероятно невозможно или, по крайней мере, замедлить объект создание экземпляра, так как вам придется хранить код класса и выполнять его при создании объектов.
Да, это неожиданно. Но как только пенни падает, она прекрасно вписывается в то, как работает Python в целом. На самом деле, это хорошее учебное пособие, и как только вы поймете, почему это происходит, вы будете намного лучше читать python.
Это говорит о том, что он должен занимать видное место в любом хорошем учебнике Python. Потому что, как вы говорите, все рано или поздно сталкиваются с этой проблемой.
Вы можете использовать логический флаг для отслеживания - это нечетная или четная строка, то есть
$isOdd = true;
while(...){
if($isOdd) echo '<li style="background: #222;"></li>';
else echo '<li></li>';
$isOdd = ! $isOdd;
}
Или еще лучше
$isOdd = true;
while(...){
echo '<li class="' . ($isodd ? 'odd' : 'even'). '"></li>
$isOdd = ! $isOdd;
}
Затем поместите цвета в таблицу стилей - у этого есть преимущество, вы можете даже изменить шрифты и т. д. Вы даже можете придать ему новый вид, не меняя код
Вы можете сделать что-то вроде следующего:
$colors = array('111', '222');
$i = 0;
while (...) {
echo '<li style="background: #' . $colors[$i % count($colors)] . '"></li>';
$i++;
}
Для аккуратности вы также можете превратить петлю while
в цикл for
. Например:
$colors = array('111', '222');
for ($i = 0; ...; $i++) {
echo '<li style="background: #' . $colors[$i % count($colors)] . '"></li>';
}
Вы хотите, чтобы все четные значения отображали что-то еще; это будет делать это с помощью оператора modulo:
$index = 0;
while($user = $q->fetch(PDO::FETCH_ASSOC))
{
if(++$index%2 == 0) //is index +1 even?
echo '<li style="background: #222;"></li>';
else
echo '<li></li>';
}
Если возможно, вы можете перейти в цикл for, так как вы уже определили свой $index
.
$isOdd
- логическая переменная, инициализированнаяtrue
, а в конце цикла вы переключаете ее значение междуtrue
иfalse
(инструкция$isOdd = ! $isOdd;
, она читает$isOdd = not $isOdd
т.е. он циклически меняется между истинным и ложным). – ain 9 September 2011 в 11:23