2012-05-15 1 views
1

У меня есть основная функция, которая содержит два словаря, которые я хотел бы выводить. Я пропустил, как были созданы словари.Как вернуть несколько словарей из моей основной функции Python

вот моя функция:

def main() 
    dict1 = {'a1':{'b1':1,'c1':2},'a2':{'b2':1,'c2':2}} 
    dict2 = {'cat':0,'dog':2} 
    return dict1, dict2 
if __main__ == '__main__': 
>...main() 

вот как я называю его в питон строке:

>>from filename import * 
>>x,y=main() 

Более или менее это то, что я получаю

>>print x 
'a1' 
>>print y 
'a2' 

Но это то, что я хочу:

>>print x 
{'a1':{'b1':1,'c1':2},'a2':{'b2':1,'c2':2}} 
>>print y 
{'cat':0,'dog':2} 

Что я не делаю правильно?

+1

Я скопировал ваш код в моем компиляторе, и он отлично работает ... – Martol1ni

+5

Вы не показываете фактический код. Пожалуйста, не публикуйте то, что вы не тестировали. –

ответ

2

код уже делает именно то, что вы ожидаете, что:

In [4]: def main(): 
    ...:  dict1 = {'a1':{'b1':1,'c1':2},'a2':{'b2':1,'c2':2}} 
    ...:  dict2 = {'cat':0,'dog':2} 
    ...:  return dict1, dict2 
    ...: 

In [5]: x, y = main() 

In [6]: x 
Out[6]: {'a1': {'b1': 1, 'c1': 2}, 'a2': {'b2': 1, 'c2': 2}} 

In [7]: y 
Out[7]: {'cat': 0, 'dog': 2} 

Возможно, вы случайно вызывая различные main() функцию (например, тот, который имеет другое return заявление)?

2

Вы не return ing dict1, dict2, всего dict1. Вы можете легко воспроизвести это поведение:

>>> dict1 = {'a1': 'some_stuff', 'a2': 'some_other_stuff'} 
>>> dict2 = {'cat': 0, 'dog': 0} 
>>> return_val = dict1 
>>> x, y = return_val 
>>> x 
'a1' 
>>> y 
'a2' 
>>> return_val = dict1, dict2 
>>> x, y = return_val 
>>> x 
{'a1': 'some_stuff', 'a2': 'some_other_stuff'} 
>>> y 
{'cat': 0, 'dog': 0} 

Это происходит потому, что когда вы перебирать словарь вы получите свои ключи, поэтому, когда вы делаете x, y = main() и main возвращается dict1, вы перебрать ключи dict1. Так как их две, вы не получите ошибку, и x и y возьмите значение этих ключей.

Если вы изменили main, чтобы вернуть оба словаря, все должно быть хорошо.

+0

Код, который он отправил *, возвращает два словаря, поэтому все должно быть хорошо. Код, который он выполняет *, не выполняет. – cvoinescu

+0

@cvoinescu Да, код, который он опубликовал, в порядке. Но это, очевидно, не его реальный код, так что это не то, что я адресую в своем ответе. Было бы хорошо, если бы люди, задающие вопросы, не совершали такую ​​ошибку, но по крайней мере в этом случае реальная проблема понятна. – agf

+0

Возможно, он выполняет старый код, потому что он не знает, как перезагрузить модуль ('reload (filename)'), чтобы применить сделанные им изменения к filename.py? – cvoinescu