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的新手,我很困惑。
答案 0 :(得分: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
每次都返回一个新的词典
答案 1 :(得分:3)
这是因为query
和query2
都指向同一个对象。 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'}
答案 2 :(得分:1)
您正在将相同的dict复制到query2中。相反,您可能希望通过创建函数template_query()并每次构造一个新的dict来创建所需的dict:
class MyOwnClass:
# a template dict
def template_query():
d = {}
d['name'] = 'mat'
d['age'] = '12'
d['car'] = 'ferrari'
return d