Python 目录中的问题

Python 目录中的问题,python,list,dictionary,Python,List,Dictionary,它给了我 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'

它给了我

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'}]
我想为这个列表使用一个模板,因为我会经常使用它,并且有一些默认变量不需要更改


为什么执行此操作时,
模板\u查询
本身会发生变化?我是python新手,我感到非常困惑。

这是因为您每次都指向同一本词典。。。覆盖这些键

[{'age': '23'  , 'name': 'sam'}, {'age': '19', 'name': 'dj'}]
这应该说明你的问题

# 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}]

这将使
obj.template\u query
每次都返回一个新的dict

这是因为您每次都指向同一个字典。。。覆盖这些键

[{'age': '23'  , 'name': 'sam'}, {'age': '19', 'name': 'dj'}]
这应该说明你的问题

# 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}]

这将使
obj.template\u query
每次将同一个dict复制到query2时都返回一个新的dict。相反,您可能希望通过创建函数模板_query()并每次构造一个新的dict来创建所需的dict:

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

您正在将同一个dict复制到query2中。相反,您可能希望通过创建函数模板_query()并每次构造一个新的dict来创建所需的dict:

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

这是因为
query
query2
都指向同一个对象<代码>对象模板查询,在本例中

最好创建一个模板工厂:

class MyOwnClass:

  # a template dict
  def template_query():
    d = {}
    d['name'] = 'mat'
    d['age'] = '12'
    d['car'] = 'ferrari'
    return d
每次调用时都会创建一个新词典。因此,您可以:

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

这是因为
query
query2
都指向同一个对象<代码>对象模板查询,在本例中

最好创建一个模板工厂:

class MyOwnClass:

  # a template dict
  def template_query():
    d = {}
    d['name'] = 'mat'
    d['age'] = '12'
    d['car'] = 'ferrari'
    return d
每次调用时都会创建一个新词典。因此,您可以:

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

很好的答案:)以及鼓励更好的编码实践的一般方法很好的答案:)以及鼓励更好的编码实践的一般方法谢谢你们的答案。我认为最简单的修复方法是按照你的建议返回dict函数。谢谢你的回答。我认为修复它的最简单方法是按照您的建议返回带有函数的dict。