0

我错过了什么?我有一个像这样的字典(它是动态创建的):

googlers = 3
goog_dict = {}
dict_within = {'score':[], 'surprise':''}
for i in xrange(googlers):
   name = "goog_%s" %i
   goog_dict[name] = dict_within 

现在我想添加一些数据:

tot =[23,22,21] 
best_res = 8


for i in xrange(len(tot)):

   name = "goog_%s" %i
   print name
   rest = tot[i] - best_res
   if rest % 2 == 0:
      trip = [best_res, rest/2, rest/2]

   elif rest % 2 != 0:
      rest_odd = rest / 2
      fract_odd = rest - rest_odd
      trip = [best_res, rest_odd, fract_odd]

   if (max(trip) - min(trip)) == 2:
      surpr_state = True
   elif (max(trip) - min(trip)) < 2:
      surpr_state = False

   goog_dict[name]['score'].append(trip)
   goog_dict[name]['surprise'] = surpr_state

我希望我的输出是:

{'goog_2': {'surprise': True, 'score': [8, 7, 8]}, 'goog_1':{'surprise': True, 'score':  [8, 7, 7]}, 'goog_0': {'surprise': True, 'score': [8, 6, 7]}}

但我得到的是:

{'goog_2': {'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}, 'goog_1':{'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}, 'goog_0': {'surprise': True, 'score': [[8, 7, 8], [8, 7, 7], [8, 6, 7]]}}

那么,为什么列表会trip附加到所有dicts 而不是仅具有 current 的一个name

4

2 回答 2

3

编辑:

正如我猜测的那样。您的 goog_dict 的每个元素都是相同的元素。阅读一些关于关系的内容,因为它可能真的很有帮助。

将您的代码更改为:

goog_dict = {}
googlers = 3
for i in xrange(googlers):
   name = "goog_%s" %i
   dict_within = {'score':[], 'surprise':''}
   goog_dict[name] = dict_within 

现在应该没问题了。

也看看这个例子。这就是你的情况。

>>> a = []
>>> goog_dict = {}
>>> goog_dict['1'] = a
>>> goog_dict['2'] = a
>>> goog_dict['3'] = a
>>> goog_dict
{'1': [], '3': [], '2': []}
>>> goog_dict['1'].append([1, 2, 3])
>>> goog_dict
{'1': [[1, 2, 3]], '3': [[1, 2, 3]], '2': [[1, 2, 3]]}

这是一个很常见的错误。

于 2012-06-20T12:30:23.630 回答
2

试试这个:

googlers = 3
goog_dict = {}
for i in xrange(googlers):
   name = "goog_%s" %i
   goog_dict[name] = {'score':[], 'surprise':''}

dict 中的值"score"在任何地方都指向同一个列表,因此您看到了效果。尝试将您的 dict-building 代码粘贴到这个 python 代码可视化器中,看看会发生什么。

于 2012-06-20T12:47:14.767 回答