2012-10-18 59 views
1
class MyOwnClass: 

    # list who contains the queries 
    queries = [] 

    # a template dict 
    template_query = {} 
    template_query['name'] = 'mat' 
    template_query['age'] = '12' 

obj = MyOwnClass() 

query = obj.template_query 
query['name'] = 'sam' 
query['age'] = '23' 
obj.queries.append(query) 

query2 = obj.template_query 
query2['name'] = 'dj' 
query2['age'] = '19' 
obj.queries.append(query2) 

print obj.queries 

它給了我問題字典的名單

[{'age': '19', 'name': 'dj'}, {'age': '19', 'name': 'dj'}] 

,而我希望有

[{'age': '23' , 'name': 'sam'}, {'age': '19', 'name': 'dj'}] 

我想用一個模板,這個名單是因爲我會用它很多時候,有一些默認變量不需要改變。

爲什麼要做template_query本身的變化?我是python的新手,我感到非常困惑。

回答

5

這是因爲你是指向每一次相同的字典...並覆蓋鍵...

# query = obj.template_query - dont need this 
query = {} 
query['name'] = 'sam' 
query['age'] = '23' 
obj.queries.append(query) 

query2 = {} #obj.template_query-dont need this 
query2['name'] = 'dj' 
query2['age'] = '19' 
obj.queries.append(query2) 

這應該表現出你的問題

>>> q = {'a':1} 
>>> lst = [] 
>>> lst.append(q) 
>>> q['a']=2 
>>> lst 
[{'a': 2}] 
>>> lst.append(q) 
>>> lst 
[{'a': 2}, {'a': 2}] 

,你可以實現你的類不同

class MyOwnClass: 
    # a template dict 
    @property 
    def template_query(): 
     return {'name':'default','age':-1} 

這將使obj.template_query返回一個新的di ct每次

+0

謝謝你的回答。解決它的最簡單方法我認爲是按照您的建議使用函數返回字典。 – gaggina

1

您正在將相同的dict複製到query2中。相反,你可能希望通過創建一個功能template_query(),每次構建一個新的字典,以創建所需的字典:

class MyOwnClass: 

    # a template dict 
    def template_query(): 
    d = {} 
    d['name'] = 'mat' 
    d['age'] = '12' 
    d['car'] = 'ferrari' 
    return d 
3

這是因爲queryquery2都指的是同一個對象。在這種情況下,爲obj.template_query

更好地使模板廠:

def template_query(**kwargs): 
    template = {'name': 'some default value', 
       'age': 'another default value', 
       'car': 'generic car name'} 
    template.update(**kwargs) 
    return template 

這造成每次它被稱爲一次新的字典。所以你可以這樣做:

>>> my_query = template_query(name="sam") 
>>> my_query 
{'name': 'sam', 'age': 'another default value', 'car': 'generic car name'} 
+1

很好的回答:)以及鼓勵更好的編碼習慣的方法 –