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