Python2.7全局变量未更新(使用函数)

2024-04-16 16:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我在测试我的新代码所需要的一些东西,但是我遇到了一个问题。我将代码简化为:

def SomeFunction():
    global Turn
    if Turn == 1:
        #some code
        Turn = 0

    if Turn == 0:
        #some code
        Turn = 1

    print Turn

Turn = 1
for i in range(10):
    SomeFunction()  

我遇到的问题是这个函数一直打印1,10次。我想要的是打印1,然后是0,然后是1,依此类推。在

我看了一些现有的堆栈溢出文章,但它们都建议我必须告诉python变量Turn在函数内部是全局的,但由于我已经在做这件事,这让我很困惑。在

但是我必须使用全局变量,所以只使用局部变量不是解决方案。在

谨致问候, 危害


Tags: 函数代码inforif堆栈def文章
2条回答

问题是你一次又一次地重写Turn。尝试使用

elif Turn == 0:

而不是

^{pr2}$

如果Turn等于1,则第一个if条件为真,因此Turn将设置为0。但随后执行传递到第二个if条件,现在是True,因此Turn将重置为1。在

明智的处理方法是使用elif,正如其他人所提到的那样。或者,您可以将print复制到两个分支中,并在第一个分支中放置一个早期的returnelif方法更好,因为它避免了代码重复,而且如果可以,它也是避免早期{}的好方法。但我还是给你看代码:

def SomeFunction():
    global Turn
    if Turn == 1:
        #some code
        Turn = 0
        print Turn
        return

    if Turn == 0:
        #some code
        Turn = 1
        print Turn

Turn = 1
for i in range(10):
    SomeFunction()  

输出

^{pr2}$

顺便说一句,Python通常的惯例是对简单的变量和函数名使用小写。类名使用大写和CamelCase名称。当然,没有来遵循这个约定,但是如果你不这样做,在大多数语法突出显示软件中查看代码时,它会使代码看起来很奇怪,因此对于Python社区的其他成员来说,这是不必要的混乱。在

有关详细信息,请参见PEP 0008 Style Guide for Python Code。在


实际上,您可以在0和1之间交替使用一个值,而无需使用if语句。诀窍是使用异或运算符^

def SomeFunction():
    global Turn
    Turn ^= 1
    print Turn

Turn = 1
for i in range(10):
    SomeFunction()  

这将产生与以前相同的输出。在

如果一个只有ever的变量的值是0和1,那么您应该考虑将其改为布尔值,并在False和{}之间交替使用,因为这样可以生成更具可读性的代码。您可以将其替换为:

Turn = not Turn

你可以在算术表达式中使用一个布尔值,它的行为就像0或1,尽管有些人不喜欢这样做,并认为它的可读性较低。在


我想我还应该提到您应该尽量避免使用global。它可能很方便,但是使用可修改的全局变量会破坏代码的模块性。对于小脚本来说这不是什么大问题,但是当您编写大型复杂的程序时,您将真正欣赏模块化设计。在

相关问题 更多 >