Python无法返回函数值?

时间:2017-06-29 13:42:32

标签: python python-3.x

我很高兴见到你。我最近(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"正常。我试图找到答案,但失败了。有什么想法吗?

5 个答案:

答案 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