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 新手,我很困惑。

4

3 回答 3

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每次返回一个新的字典

于 2012-10-18T16:38:06.540 回答
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'}
于 2012-10-18T16:42:34.313 回答
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
于 2012-10-18T16:40:43.840 回答