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

是的,這是預期的行爲 - 但爲什麼有點棘手解釋。問題是您正在向JsonProperty初始化程序傳遞list實例。該列表實際上是global。所以,只要你得到「默認」foo,你就會得到全局實例 - 並且附加到全局實例中的任何地方都會附加到它。

這裏的要點是不要使用可變參數作爲默認值。你關好,再寫入add_to_foo

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

注意,這會變得更加有趣,如果你的項目.get一回了數據存儲的。假設實體沒有在本地緩存,那麼他們就不會引用全局列表 - 只有列表狀態的副本是.put