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

Python:当我在另一个函数中调用一个函数时,没有变化,python,python-3.x,Python,Python 3.x,因此,在某些上下文中,我的第一个函数就是这个(我正试图调用的函数): 这样,我就可以在这个函数中调用它: def Dishlist_change_price(dishlist: DL, change: int) -> float: for i in dishlist: Dish_change_price(i, change) print(i.price) 在完成函数(Dishlist\u change\u price(DL,100))后,我希望它打

因此,在某些上下文中,我的第一个函数就是这个(我正试图调用的函数):

这样,我就可以在这个函数中调用它:

def Dishlist_change_price(dishlist: DL, change: int) -> float:
    for i in dishlist:
        Dish_change_price(i, change)
        print(i.price)
在完成函数(Dishlist\u change\u 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)

我不明白为什么直接调用函数并不会改变每个菜式,但放在体内就可以了。如果这是一个非常简单的问题,我很抱歉。

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

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

需要注意的是,您的原始代码可以处理其他可变的对象类型。但是命名的元组不是,因此它成为一个新的对象引用。如果您在每一个中运行print(id(i)),您将看到标识(内存中的位置)将不同,并且您正在打印原稿的价格。

我想您需要这样的东西:

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\u change\u price()中返回新菜。这就是为什么您总是保留初始值。

您正在创建一个新的菜,有一个新的价格,但打印出旧菜的价格。因为您正在丢弃返回值。你从不把函数调用的结果分配给任何东西。我明白了。根据csevier的评论和回答,我能够应用你所说的。谢谢你的帮助和时间。哦,我明白了。非常感谢你的帮助。另外,当我打印(I.price)时,我收到了“AttributeError:‘float’object没有属性‘price’”,但我意识到我被设置为要打印的值。所以我只是把它改成了打印(I),这样就行了。再次感谢你的解释。很高兴我能帮忙。谢谢你的回答!这个对我来说也很有意义。
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)