代码之家  ›  专栏  ›  技术社区  ›  Vince Snetterton

试图理解Python 3.7中如何从函数返回到主程序的数字

  •  -1
  • Vince Snetterton  · 技术社区  · 3 年前

    一般来说,我无法让任何函数返回变量内的值(一个整数,返回主程序)。我已将变量名作为函数中的两个参数之一(在本例中为mod\u stone\u value),并使用return命令希望将该整数值返回主程序,然后将该值添加到总值中。

    函数中的关键代码行是:

    def calc_real_stone_value(base_stone_value, mod_stone_value):
    
    return mod_stone_value
    

    然后,回到主程序:

    total_stone_value = total_stone_value + mod_stone_value
    

    变量total\u stone\u value最终为0,但mod\u stone\u value的非零值会在函数中打印出来。我知道我在做一些根本错误的事情,但我不知道那是什么。

    2 回复  |  直到 3 年前
        1
  •  1
  •   Zack Walton    3 年前

    如果我理解正确,您希望使用函数返回的数值 calc_real_stone_value 并且很困惑,为什么在调用所谓“更新其值”的函数后,它没有改变。

    您误解的最根本的一点是,原始数据类型(double、int、char等)是通过值传递的,而不是通过引用传递的。因此,如果更改局部变量 mod_stone_value 在函数内,更改不会显示在函数外部的变量中。如果要使用随行返回的值 return mod_stone_value 您需要使用要在计算中使用的变量调用函数,然后将该值赋给变量( mod\U stone\U值 在这种情况下)。

    例子:

    base_stone_value = 1
    mod_stone_value = 4
    
    
    def calc_real_stone_value(base_stone_value, mod_stone_value):
        # calculations
        # e.g. add the two integer arguments
        mod_stone_value += base_stone_value
        return mod_stone_value
    
    # print the values for mod_stone_value
    print(mod_stone_value)
    # call function and assign value to mod_stone_value
    mod_stone_value = calc_real_stone_value(base_stone_value, mod_stone_value)
    print(mod_stone_value)
    
    
    

    输出:

    4
    5
    

    结论:

    原语变量按值传递,为了从返回整数的函数中检索值,例如,需要对其重新赋值。

    为了减少混淆,可以避免使用 阴影 外部作用域中的变量名称。

        2
  •  1
  •   OTheDev    3 年前

    以代码为模板,下面的示例演示了如何将值从函数的“内部”传递到外部级别(这里是程序的最外层)。我建议您阅读 official Python tutorial (或从 beginning 如果它没有意义),因为它描述了与您的问题相关的概念(例如全局变量与局部变量)。

    c = 0
    d = 5 
    e = 2
    
    def foo(a, b):
        # insert whatever code here
        d = 10 
        print(f"Inside foo(), d has value {d}")
        # to match your example
        return b
    
    # c has the value 0, d has the value 5 
    print(f"(c, d) has the value ({c}, {d})") 
    
    # call function and pass return value to c 
    c = foo(d, e)
    
    # c has the value 2, d has the value 5 
    print(f"(c, d) has the value ({c}, {d})") 
    

    顺便说一下,关于代码,函数体中的语句应该缩进。这包括 return 陈述