Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使函数在while循环中更改变量?_Python_Function_Loops - Fatal编程技术网

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

Python 如何使函数在while循环中更改变量?,python,function,loops,Python,Function,Loops,因此,每当我运行这段代码时,它不会更改done的值,它始终保持在1。我希望它改为10,停止while循环。我只想在这种类型的模块中使用它。函数中的really_-done变量和模块级别的really_-done变量位于不同的范围(也称为名称空间)。前者是局部变量,后者是全局变量 您不能向while循环发出要以这种方式退出的信号,因为本地作用域与全局作用域是隔离的。相反,函数需要向调用者发出信号,表明您已经使用返回值完成了操作: def lol(done, really_done): do

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

函数中的
really_-done
变量和模块级别的
really_-done
变量位于不同的范围(也称为名称空间)。前者是局部变量,后者是全局变量

您不能向
while
循环发出要以这种方式退出的信号,因为本地作用域与全局作用域是隔离的。相反,函数需要向调用者发出信号,表明您已经使用返回值完成了操作:

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)        ---+

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

一般问题是,您希望在调用
lol
时保存
done
really\u done
的状态。有几种方法可以做到这一点,所以我将考虑另一种可能性

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

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)

每次运行循环时都会重置
done
的值。不仅如此-您试图更改全局变量的值,而是更改一个简单参数的值,因此
lol(done)
实际上没有做任何事情

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

def lol():
全球完成
全球真的吗
完成+=1
真的吗
真的吗
完成=0
虽然没有真正做到:
lol()
这应该是可行的,但是这是糟糕的代码-如果不是真正需要的话,就不应该使用
global
。您可以使用
return
保持代码的整洁,而不必对代码进行太多更改:

def lol(完成,真的完成):
完成+=1
真的吗
返回完成,真的完成
真的吗
完成=0
虽然没有真正做到:
完成,真的完成=lol(完成,真的完成)
这样会好一点。然而,我们可以通过简单地将
范围
for
循环来解决所有问题:

done=0
对于范围(10)内的n:
完成+=1
打印(完成)

您不喜欢a作为旁白吗?我可以谦恭地建议您多了解一下python吗?一般来说,当你在专业板上提问时,那里的专业人士希望你已经精通基础知识。函数
lol()
中的
done
与它下面的
while
循环使用的不同,因为它是函数中的参数/局部变量。最简单但不是最好的修复方法是在函数的开头添加一个“global done”来纠正这个错误,并停止将其作为参数传递。
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)
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()