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、毎回新しいdictが返されます

于 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() を作成し、毎回新しい dict を構築することで、必要な dict を作成したい場合があります。

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 に答える