问题描述
我有 2 个变量,专门称为“cowPosition”和“bullPosition”,但是在函数内部看不到它
这是我的代码片段
cowPosition = 1
bullPosition = 1
def gameplay():
setposition(True) # Sets the starting position for both bull and cow
while cowPosition or bullPosition >= 25:
bullPosition += 1
print(bullPosition)
我也想让它循环 25 次直到 BullPosition = 25
解决方法
快速解决方案是声明局部变量而不是全局变量:
def gameplay():
cowPosition = 1
bullPosition = 1
while cowPosition or bullPosition >= 25:
bullPosition += 1
print(bullPosition)
要了解这是如何工作的,我建议您阅读有关局部作用域和全局作用域之间的区别。
,您缺少有关 Python 变量作用域的一些基本知识。 cowPosition
和 bullPosition
都是所谓的全局空间的一部分。 gameplay
方法不允许修改该变量,因为 cowPosition
和 bullPosition
都不在 gameplay
的本地范围内。
虽然你可以这样做:
my_variable = 1
def my_func():
print(my_variable) # print does not modify my_variable
您正在尝试使用以下行修改 bullPosition
的值:
bullPosition += 1
除非您使用 global
关键字指定,否则您不能更改该变量的值。例如,您不能这样做:
my_variable = 1
def my_func():
my_variable += 1 # this expression would modify my_variable
抛出:
UnboundLocalError:赋值前引用了局部变量“my_variable”
def my_func():
global my_variable # specify that you want to modify variable
my_variable += 5
my_variable = my_variable + 1
警告
虽然使用 global
似乎是一个神奇的修复,但通常不鼓励使用它,尤其是在较大的程序中。这样做的原因是您最终可能会意外地改变(改变值和/或类型)全局变量。您可以想象,如果您的函数使用 global
关键字来改变变量,那么追踪这样的错误会有多困难。相反,您可以将它们作为参数传递:
gameplay(cowPosition,bullPosition):
...
gameplay(1,1)
,
你遇到的所有问题:
- 变量应该在函数内部
- 您在 while 循环中放置了错误的运算符,它应该是 = 否则它将成为一个永远循环
- 在 while 循环中,您放置了一个 or 语句,因此即使 BullPosition 为 25,它仍会运行,因为 cowPosition 不是 25(如果您希望它像那样,这不是错误)
最终代码:
def gameplay():
cowPosition = 1
bullPosition = 1
while cowPosition or bullPosition < 25:
bullPosition += 1
print(bullPosition)
如果你想在函数外使用变量,只需将它们设为全局变量,如下所示:
def gameplay():
global cowPosition = 1
global bullPosition = 1
while cowPosition or bullPosition < 25:
bullPosition += 1
print(bullPosition)