1

У меня есть следующая настройка. Почему свойство списка по умолчанию для JsonProperty сохраняет предыдущие значения, присвоенные ему в других объектах. Я что-то упускаю?GAE ndb.JsonProperty() список по умолчанию

class Item(ndb.Model): 
    foo = ndb.JsonProperty(default=[]) 

    def add_to_foo(self, value): 
     self.foo.append(value) 
     return 

item1 = Item() 
item1.add_to_foo('one') 
item1.put() 

item2 = Item() 
item2.add_to_foo('two') 
item2.put() 

print item2.foo # prints out ['one', 'two'] 

Почему это печатает ['one', 'two']? Я только дал это «два». Это ожидаемое поведение?

ответ

5

Да, это ожидаемое поведение, но почему это немного сложно объяснить. Проблема в том, что вы передаете экземпляр list в инсталлятор JsonProperty. Этот список фактически global. Таким образом, в любое время, когда вы получаете «default» foo, вы получите глобальный экземпляр - и добавление к нему будет добавляться к нему повсюду.

Пункт не использует изменяемые аргументы в качестве значений по умолчанию. Вы лучше переписывания add_to_foo:

def add_to_foo(self, value): 
    if self.foo: 
     self.foo.append(value) 
    else: 
     self.foo = [value] 

Обратите внимание, что это получает даже немного более интересным, если вы .get один из ваших вещей обратно из хранилища данных. Предполагая, что объект не был кэширован локально, в этот момент у них не будет ссылки на глобальный список - только копия состояния списка, когда оно было .put.

Смежные вопросы