如何在while循环中使函数更改变量?

时间:2018-05-04 22:55:39

标签: python function loops

def lol(done, really_done):
    done = done + 1
    print(done)
    if done == 10:
        really_done = True

really_done = False
while really_done == False:
    done = 0
    lol(done, really_done)

因此,每当我运行此代码时,它都不会更改done的值,它始终保持为1.我希望它更改为10并停止while循环。我只想在这种模块中使用它。

3 个答案:

答案 0 :(得分:1)

一般问题是,您希望在done的调用中保存really_donelol的状态。有几种方法可以做到这一点,所以我会抛出另一种可能性。

保持函数状态的常用方法是使用类:

class Lol:

    def __init__(self, done=0, max_done=10):
        self.done = done
        self.max_done = max_done

    @property
    def really_done(self):
        self.done >= self.really_done

    def lol(self):
        self.done += 1

lol = Lol()
while not lol.really_done:
    lol.lol()

答案 1 :(得分:0)

really_done函数中的lol变量和模块级别的really_done变量位于不同的范围(通常也称为名称空间< / em>的)。前者是局部变量,后者是全局变量

def lol(done, really_done):
    done = done + 1               ---+
    print(done)                      |
    if done == 10:                   +--- the local scope (inside a `def`)
        really_done = True        ---+

really_done = False               ---+
while really_done == False:          |
    done = 0                         +--- the GLOBAL scope 
    lol(done, really_done)        ---+

您无法以这种方式向while循环发出信号,因为本地范围与GLOBAL范围隔离。相反,该函数需要通过使用返回值向调用者发出信号:

def lol(done, really_done):
    done = done + 1
    print(done)
    if done == 10:
        really_done = True
    return done, really_done

done = 0
really_done = False
while really_done == False:
    done, really_done = lol(done, really_done)

使用返回值允许将本地作用域(函数名称空间)中的信息传递回全局作用域(模块名称空间)。这与向函数传递参数允许来自外部作用域(模块名称空间)的信息作为本地作用域(函数名称空间)中的信息接收的方式类似。

答案 2 :(得分:-2)

每次运行循环时,您都会重置done的值。不仅如此 - 您尝试将值更改为全局变量,而是更改简单参数的值,因此lol(done)实际上并未执行任何操作。

如果要将其保留在函数中,则应使用关键字global来表示您正在使用全局变量:

def lol():
    global done
    global really_done

    done += 1
    really_done = done == 10

really_done = False
done = 0
while not really_done:
    lol()

这应该有用,但这是错误的代码 - 如果不是真正的需要,你不应该使用global 。不会改变很多代码,您可以使用return来保持代码清洁:

def lol(done, really_done):
    done += 1
    really_done = done == 10

    return done, really_done

really_done = False
done = 0
while not really_done:
   done, really_done = lol(done, really_done)

这让它变得更好。然而,我们只需使用range

循环for即可解决所有问题
done = 0
for n in range(10):
    done += 1
print(done)