我很高兴见到你。我最近(2天前准确)决定选择python(python 3)作为我的第一个编程语言。当我开始玩各种功能时,我碰到了一个我自己无法解决的问题,这也是我决定在这里寻求建议的原因。
我创建了一个简单的函数,从x到0时调用0到100000.有问题的部分是,当它完成时,函数应该返回新的x值(即100001)。
这是原始代码:
x = 0
def function(x):
while True:
print(x)
x += 1
if x == 100001:
return x
break
if x == 0:
function(x)
if x==100001:
print("TRUE")
else:
print("FALSE")
正如我预期的那样,编译后程序开始计数为0并结束于100000.尽管它仍然打印出来" FALSE"在末尾。我玩弄了不断变化的数字和小细节,但最后它仍然没有按预期工作。试图找出错误我将我的代码重新编写为:
x = 0
def function(x):
while True:
print(x)
x += 1
if x == 100001:
print("x= %d" % x)
return x
break
if x == 0:
function(x)
if x==100001:
print("TRUE")
else:
print("x= %d" % x)
在输出结束后计数后,我得到以下几行: x = 100001 x = 0
我认为我的功能返回" x"正常。我试图找到答案,但失败了。有什么想法吗?
答案 0 :(得分:3)
由于python中的整数为immutable,因此不要期望该函数能够改变它的值。
当你已经从函数返回x时,你只需要像这样抓住它:
if x == 0:
x = function(x)
顺便说一下,您可以在返回后删除break
语句,当它返回x上面的一行时,它没有意义。
答案 1 :(得分:2)
因为函数有自己的局部范围。函数内的x
与外部的x
不同。虽然x
变量可能等于100001,但在全局范围内它仍然等于0,因此语句x==100001
为false。
尝试从建议的函数(如@omri_saadon)返回布尔值或x
。
仅用于教育目的,我不建议你这样做,但你也可以使用global关键字在函数中使用相同的x变量。
def function(x):
global x;
...
现在您的代码应该按照您最初的预期运行。
答案 2 :(得分:0)
function(x)是一个值。如果要将其保存在x中,则必须将结果影响到该值。你的代码应该是:
if x == 0:
x = function(x)
if x==100001:
print("TRUE")
else:
print("x= %d" % x)
此外,您可以通过将测试放在while语句中来简化您的功能:
def function():
x=0
while (x<=100001):
print(x)
x += 1
return x
在很清楚你在做什么之前,我不建议在循环中使用break。
答案 3 :(得分:0)
这是由于范围规则。函数x
内的function
会覆盖外部作用域中的x
。如果将参数重命名为y
并将函数的返回值分配给x
,则会更加清晰,如下所示:
x = 0
def function(y):
while True:
print(y)
y += 1
if y == 100001:
return y
break
if x == 0:
x = function(x)
if x==100001:
print("TRUE")
else:
print("FALSE")
答案 4 :(得分:0)
由于范围参考,x的值不会改变。在函数中,您引用的是局部变量x,而不是全局变量x。您可能希望将x的值设置为函数返回的值。
if x == 0:
x = function(x)
或者,您可以在函数内部使用global
来引用全局变量,但最好不要混合使用全局变量和本地范围。
此外,出于这个原因,最好不要使用相同的变量声明 当您共享变量名称时可能会变得混乱,并且在非预期时很容易覆盖值。
将范围视为您正在进行的对话:您有两个名叫John的朋友,但他们不是同一个人。如果你只希望与一个John而不是另一个人交谈,那么你通过选择所需的John来声明,在这种情况下是变量x。
调试时,知道你得到了什么是很有用的,以后你应该输出变量的实际值,以确定该值是否符合预期。
if x == 0:
function(x)
print(x) # Prints 0
添加到修改后的函数调用:
if x == 0:
x = function(x)
print(x) # Prints 100001