2012-10-18 58 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

很好的回答:)以及鼓励更好的编码习惯的方法 –