Python:变量不是累积传递函数

时间:2014-01-24 02:27:41

标签: python

我正在编写一个文本冒险功能,当玩家获得经验(然后在达到100时将玩家调高)时,它会充当进度条。出于某种原因,即使我已经返回了全部三个函数,更改函数内部变量的值也不会更改函数外部的值。当我尝试两次调用函数时,每次将 85 添加到变量 a 时,这一点就变得很明显了。

在该函数中,目标是将 a 的值传递给 b ,检查 b 是否大于或等于 100 ,如果是这样,将 1 添加到 c 并从 b 中删除 100 ,然后将 a 重置为 0 打印结果,并返回新值。 < / p>

a =新体验 b =当前体验 c =玩家等级

a = 0
b = 0
c = 1

def func_1(a, b, c):
    b = b + a
    loop1 = 0
    while loop1 < 1:
        if b >= 100:
            print(" ")
            print("Add 1!")
            print(" ")
            c = c + 1
            b = b - 100
        else:
            loop1 = loop1 + 1
        a = a - a
        print("c is " + str(c))
        print("b is " + str(b))
        print("a is " + str(a))
        return a
        return b
        return c

a = a + 85
func_1(a, b, c)
a = a + 85
func_1(a, b, c)
print a, b, c

我是编程新手,所以我为任何低效率道歉。感谢您的帮助,如果某些事情没有意义/不清楚,请告诉我。

4 个答案:

答案 0 :(得分:1)

我在这里看到的一些事情:

首先,在代码末尾的三个return语句中,只执行第一个return areturn语句立即停止执行该函数;永远不会触及return breturn c

其次,你对变量的范围有些困惑。在函数外部定义的abc全局变量,而ab和{ {1}}传递给函数的是 local 到函数的范围。因此,对函数中变量的任何修改都不会影响全局变量。

你可以做两件事。首先,在函数开头有一个全局声明:

c

这表明函数def func_1(): global a global b global c # Function body ab是函数外部的全局变量。因此,不再需要传递参数;该函数将搜索函数外的变量。但是,这是糟糕的编程习惯。更好的选择是让c返回修改后的值并将全局值重新分配给这些新值,如下所示:

func_1

然后,调用函数并修改函数外的变量:

def func_1(a, b, c):
    # Function body
    return (a, b, c)

一些建议:

你有很多增量,python有专门的语法:a, b, c = func_1(a, b, c) 可以缩短为b = b + ab += a缩短为c = c + 1,{{1到c += 1。此外,只需使用b = b - 100将a重置为0,而不是减去b -= 100。此外,您不需要a = 0; a - a就足够了。

接下来,您的print(" ")循环是不必要的。您的函数只需要检查print()是否一次,因此不需要设置循环。增加while然后使用简单的b >= 100语句在必要时进行升级:

b

答案 1 :(得分:0)

func_1()内,名称a,b,c本地。当你更改它们时,外部a,b,c没有任何反应。您在函数中正确return了值,但是在调用函数时,您需要将值分配给变量,如下所示:a,b,c=func_1(a,b,c)

答案 2 :(得分:0)

除非在调用函数中明确指定值,否则返回值不会设置它:

a, b, c = func_1(a, b, c)

在函数内部分配不会影响外部函数,因为它们被视为“局部作用域”。为了反驳它,声明它们是全局的,以影响外部变量:

def func_1():
    global a
    global b
    global c

只应实施其中一项

通常不首先声明全局变量。理想情况下,您应该为所有这些创建一个类,但这两个选项需要对现有代码进行最少的重构

答案 3 :(得分:0)

请注意,全局变量(函数外部的变量)与局部变量(函数内部的变量)完全分开。

这不起作用,因为您只能返回一次。当您返回a时,该功能立即停止。 此外,由于未将任何变量设置为返回值,因此循环外的全局变量不受影响。你可以做的是将a,b和c值作为元组返回,然后将a,b和c全局变量设置为该元组。

return (a, b, c)

a, b, c = func_1(a, b, c)