首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:当我在另一个函数中调用一个函数时,没有变化

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

Stack Overflow用户
提问于 2018-07-17 05:20:04
回答 2查看 57关注 0票数 1

所以在一些上下文中,我的第一个函数就是这里的这个函数(我正在尝试调用的函数):

代码语言:javascript
复制
def Dish_change_price(dish: Dishes, change: int) -> float:
    percent = change/100
    dish = dish._replace(price=dish.price + dish.price*percent)
    return dish.price

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

代码语言:javascript
复制
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函数中时,它会做我想让它做的事情。如下所示:

代码语言:javascript
复制
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)

以下是供参考的列表:

代码语言:javascript
复制
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)

我不明白为什么直接调用函数不会改变每一个菜,但是放在主体中就会改变。我道歉,如果这是一个非常愚蠢的问题,为了一个简单的解决。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-17 05:45:45

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

代码语言:javascript
复制
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)),你会看到身份(在内存中的位置)是不同的,并且你打印的是原始文件的价格。

票数 2
EN

Stack Overflow用户

发布于 2018-07-17 06:29:54

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

代码语言:javascript
复制
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()中返回新的菜。这就是为什么总是保留初始值的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51370261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档