Python:当我在另一个函数中调用一个函数时,没有变化

时间:2018-07-16 21:20:04

标签: python python-3.x

所以在某些情况下,我的第一个功能就是这里的那个功能(我正在尝试调用的那个功能):

def Dish_change_price(dish: Dishes, change: int) -> float:
    percent = change/100
    dish = dish._replace(price=dish.price + dish.price*percent)
    return dish.price

有了这个,我会在这个函数中称呼它:

def Dishlist_change_price(dishlist: DL, change: int) -> float:
    for i in dishlist:
        Dish_change_price(i, change)
        print(i.price)

执行完函数(Dishlist_change_price(DL,100))之后,我希望它可以将价格打印出两倍的价格(更改以百分比表示),但是它将打印价格不变。 但是,当我只拿Dish_change_price函数的主体并将其直接放入Dishlist函数中时,它便完成了我想要的工作。如:

def Dishlist_change_price(dishlist: DL, change: int) -> float:
     percent = change/100
     for i in dishlist:
         i = i._replace(price=i.price + i.price * percent)
         print(i.price)

以下是参考列表:

from collections import namedtuple
Dishes = namedtuple('Dishes', 'name price calories')
d1 = Dishes("Filet Mignon", 40, 720)
d2 = Dishes("Fried Chicken", 10, 1500)
d3 = Dishes("Sake Salmon", 15, 500)
d4 = Dishes("Filet Mignon", 40, 720)
d5 = Dishes("Pho", 11, 600)

D1 = Dishes("Pad Thai", 11, 650)
D2 = Dishes("Dim Sum", 30, 800)
D3 = Dishes("Double-Double Burger", 5, 750)
D4 = Dishes("15 Wings", 10, 900)

DL = [d1, d2, d3, d4, d5]
DL2 = [D1, D2, D3, D4]
DL.extend(DL2)

我不明白为什么直接调用该函数不会更改每个Dishes,而是将其放入体内会如此。对于很容易解决的问题,我真的很抱歉。

2 个答案:

答案 0 :(得分:2)

您需要将引用重新指向函数返回的Dishes元组。令您感到困惑的是,您到处都在使用变量“ i”。在这里,这将起作用:

def Dishlist_change_price(dishlist: DL, change: int) -> float:
    for i in dishlist:
        i = Dish_change_price(i, change)
        print(i.price)

需要注意的是,您的原始代码可以与其他可变的对象类型一起使用。但是namedtuple不是,因此它成为新的对象引用。如果您在每张纸上都运行print(id(i)),您会看到标识(在内存中的位置)会有所不同,并且您正在打印原件的价格。

答案 1 :(得分:0)

我认为您想要这样的东西:

def Dish_change_price(dish: Dishes, change: int) -> Dishes:
    percent = change/100.0
    return dish._replace(price=dish.price + dish.price*percent)

def Dishlist_change_price(dishlist: DL, change: int) -> DL:
    new_list = list()
    for dish in dishlist:
        new_list.append(Dish_change_price(dish, change))
    return new_list

changed_list = Dishlist_change_price(DL, 90)

for dish in changed_list:
    print(dish)

在您的示例中,您忘记了在Dish_change_price()中返回新菜。这就是为什么您始终保留初始值的原因。