2013-07-23 4 views
0
def sum_specified_dims(mdd, dims, keys = [], result = {}): 
    for key,value in mdd.items(): 
     keys.append(key) 
     if type(value) == dict: 
      sum_specified_dims(value, dims, keys, result) 
     else: 
      pointer = result 
      for dim in dims: 
       index = dim - 1 
       key_value = keys[index] 
       if not key_value in pointer: 
        pointer[key_value] = {} 
       pointer = pointer[key_value] 
      if key_of_sum in pointer: 
       pointer[key_of_sum] += value 
      else: 
       pointer[key_of_sum] = value 
     keys.pop() 
    return result 

key_of_sum='total' 
keys=[1] 
import datetime 
mdd={datetime.date(2013, 7, 16): {3.0: {'2.0': 8}}} 
>>> sum_specified_dims(mdd,keys) 
{datetime.date(2013, 7, 16): {'total': 8}} 
>>> sum_specified_dims(mdd,keys) 
{datetime.date(2013, 7, 16): {'total': 16}} 
>>> sum_specified_dims(mdd,keys,[],{}) 
{datetime.date(2013, 7, 16): {'total': 8}} 

Если я опускаю 3-й, 4-й параметры, результат будет накапливаться каждый раз.Почему результат меняется каждый раз?

Но это нормально, если я не опускаю никаких параметров.

Любой может объяснить, почему это происходит, это ошибка python?

UPDATE

, кажется, не всегда бывает:

>>> def f(a=2): 
...  print a 
... 
>>> f(3) 
3 
>>> f() 
2 
+0

@Blender, я привел пример, когда этого не происходит. – user2559257

+0

Целые числа неизменны, а списки и словари изменяемы. Все это объясняется связанным вопросом. – Blender

+0

@ user2559257: вы этого не сделали, вы не мутируете аргумент по умолчанию в этом случае. –

ответ

3

Причина заключается в том, что аргументы изменяемые (например, списки) по умолчанию в питон 'вспомнить' свои прежние значения.

См. http://effbot.org/zone/default-values.htm для интересного объяснения.

Смежные вопросы