我正在编写一个文本冒险功能,当玩家获得经验(然后在达到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
我是编程新手,所以我为任何低效率道歉。感谢您的帮助,如果某些事情没有意义/不清楚,请告诉我。
答案 0 :(得分:1)
我在这里看到的一些事情:
首先,在代码末尾的三个return语句中,只执行第一个return a
。 return
语句立即停止执行该函数;永远不会触及return b
和return c
。
其次,你对变量的范围有些困惑。在函数外部定义的a
,b
和c
是全局变量,而a
,b
和{ {1}}传递给函数的是 local 到函数的范围。因此,对函数中变量的任何修改都不会影响全局变量。
你可以做两件事。首先,在函数开头有一个全局声明:
c
这表明函数def func_1():
global a
global b
global c
# Function body
,a
和b
是函数外部的全局变量。因此,不再需要传递参数;该函数将搜索函数外的变量。但是,这是糟糕的编程习惯。更好的选择是让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 + a
,b += 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)