代码之家  ›  专栏  ›  技术社区  ›  lingyau lee

如何跨python函数累积添加?

  •  1
  • lingyau lee  · 技术社区  · 4 年前

    我正在两次尝试下面的字典,并希望通过分别运行两次函数来添加数量10和90。我在试累计总数是100。然而,我一直得到90分,因为它不记得我函数之外的值。 我试着把它变成全局变量,但没用。谢谢

    '''

    global new_inventory 
    global inventory
    new_inventory = {}
    def add_fruit(inventory, fruit, quantity=0):    
        if inventory == {}: 
            inventory = {fruit:quantity} 
        elif inventory != {}: 
            inventory = inventory.get(fruit,0)+ quantity
        return inventory
    
    add_fruit(new_inventory,'strawberry',10)
    add_fruit(new_inventory,'strawberry',90)
    

    '''

    2 回复  |  直到 4 年前
        1
  •  0
  •   ti7    4 年前

    不要重新分配 inventory 在你的功能,但使用它的方法!

    那么它仍然是对同一个的引用

    def add_fruit(inventory, fruit, quantity=0):
        inventory[fruit] = inventory.get(fruit, 0) + quantity
    
    >>> new_inventory = {}
    >>> add_fruit(new_inventory,'strawberry',10)
    >>> add_fruit(new_inventory,'strawberry',90)
    >>> new_inventory
    {'strawberry': 100}
    

    下面是一个更完整的例子

    >>> def foo(value):
    ...     print(f"initial value: {id(value)}")
    ...     value["a"] = 1     # mutate original dict
    ...     print(f"mutated value: {id(value)}")
    ...     value = {"b": 2}   # re-use the name for another ref
    ...     print(f"changed name:  {id(value)}")
    ... 
    >>> input_value = {}
    >>> foo(input_value)       # the id() calls show value differs!
    initial value: 132972815809856
    mutated value: 132972815809856
    changed name:  132972815874112
    >>> input_value            # only the original reference is changed!
    {'a': 1}
    
        2
  •  0
  •   Bialomazur    4 年前

    尽管使用 inventory 在这个特定的用例中,为了保持 add_fruit 更具活力&不管怎样,我会把它放在里面的。

    因此,你可以尝试:

    new_inventory = {}
    
    def add_fruit(inventory, fruit, quantity=0):
        if fruit not in inventory.keys():
            inventory[fruit] = quantity
        else:
            inventory[fruit] += quantity
    
    add_fruit(new_inventory, "strawberry", 10)
    add_fruit(new_inventory, "strawberry", 90)
    
    print(new_inventory) # {'strawberry': 100}