2013-06-22 63 views
1

我是新来的python,目前仍在学习hwo处理列表和字典。相同的列表/字典在多个功能

我有这两个功能

def food_database(item_name, size_serv, calorie_serv, protein_serv, carb_serv, fat_serv): 
     # used to list the different foods when users ask for it 
     # food database 
     food_dict = [ { 
     'food_name': item_name, 
     'serving_size': size_serv, 
     'serving_calorie': calorie_serv, 
     'serving_protien': protein_serv, 
     'serving_fat': fat_serv, 
     'serving_carb': carb_serv 
     } ] 
     print food_dict 

    def food_in_diet(item_name, size_serv, calorie_serv, protein_serv, carb_serv, fat_serv, num_serv): 
     # used to show how much is in the diet plan for the user 
     User_diet_dict = [ { 
     'food_name': item_name, 
     'amount': num_serv*size_serv, 
     'serving_calorie': num_serv*calorie_serv, 
     'serving_protien': protein_serv, 
     'serving_fat': fat_serv, 
     'serving_carb': carb_serv 
     } ] 
     print User_diet_dict 

我有这等功能

def add_food(): 
     ask_to_add_another = raw_input("Would you like to add another food?(y/n)") 
     if ask_to_add_another == 'y': 
     # update 
     item_name = raw_input("What is the name of the food you would like to add? ") 
     size_serv = input("What is the size(grams) in each serving of %s? " % item_name) 
     calorie_serv = input("How many calories is in each serving of %s? " % item_name) 
     protein_serv = input("How many grams of protein is in each serving of %s? " % item_name) 
     carb_serv = input("How many grams of carbohydrates is in each serving of %s? " % item_name) 
     fat_serv = input("How many grams of fat is in each serving of %s? " % item_name) 
     num_serv = input("How many servings of %s would you like to add? " % item_name) 

     food_dict.append({ 
      'food_name': 'item_name', 
      'serving_size': size_serv, 
      'serving_calorie': calorie_serv, 
      'serving_protien': protein_serv, 
      'serving_fat': fat_erv, 
      'serving_carb': carb_serv 
     }) 

    # User_diet_dict.append = ({ 
    #  'food_name': item_name, 
    #  'amount': num_serv*size_serv, 
    #  'serving_calorie': num_serv*calorie_serv, 
    #  'serving_protien': protein_serv, 
    #  'serving_fat': fat_serv, 
    #  'serving_carb': carb_serv 
    # }) 
     # add to the dictonary/list 
     print food_dict 
     add_food() 
     if ask_to_add_another == 'n': 
     return False 

的add_food()函数更新food_dict字典,并添加到列表中。

我得到的错误

Traceback (most recent call last): 
     File "MACROCALC.py", line 156, in <module> 
     main() 
     File "MACROCALC.py", line 35, in main 
     add_food() 
     File "MACROCALC.py", line 130, in add_food 
     food_dict.append({ 
    NameError: global name 'food_dict' is not defined 

我觉得好像是因为字典是不是全球性的,这正在发生。

这里是我的代码,如果有人想了解 - >http://pastebin.com/mc8S6fkS

开放的建议! Noob程序员希望变得更好!

感谢您的帮助!

+4

这是因为'add_food'范围内不存在'food_dict'。解决这个问题的一种方法是使其成为全局的,但更好的方法是将这些'print'改成'return's,调用'food_database',并将其输出存储在一个变量中。 – Blender

回答

1

在将变异是列表中的每个函数的顶部声明food_dictglobal。对于list mutate基本上是分配的,而不是使用append()。通常,使用类的方法并不构成我在上面描述的意义上的变异。见下:

def init(): 
    global food_dict 
    # assignment is manipulation 
    food_dict = [{'name': 'apple'}, {'name': 'orange'}] 

def next(): 
    # notice no 'global' usage but this still works 
    food_dict.append({'name': 'kiwi'}) 

def lastly(): 
    global food_dict 
    # assign to empty list 
    food_dict = [{}] 

>>> init() 
>>> print food_dict 
[{'name': 'apple'}, {'name': 'orange'}] 
>>> next() 
>>> print food_dict 
[{'name': 'apple'}, {'name': 'orange'}, {'name': 'kiwi'}] 
>>> lastly() 
>>> print food_dict 
[{}] 
1

添加下面的每个子routine-

global food_dict