Python 2.7-全局变量不更新(使用函数)

Python 2.7-全局变量不更新(使用函数),python,python-2.7,global,Python,Python 2.7,Global,今天我在测试我的新代码需要的一些东西,但是我遇到了一个问题。我将代码缩减为以下内容: 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

今天我在测试我的新代码需要的一些东西,但是我遇到了一个问题。我将代码缩减为以下内容:

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在函数中是全局的,但由于我已经在这样做,这让我感到困惑

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

问候,,
伤害

问题是你一次又一次地覆盖回合。试用

elif Turn == 0:
而不是

if Turn == 0:

问题是你一次又一次地覆盖回合。试用

elif Turn == 0:
而不是

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

处理这个问题的明智方法是使用
elif
,正如其他人所提到的那样。或者,您可以将
打印
复制到两个分支中,并将早期的
返回
放在第一个分支中。
elif
方法更好,因为它避免了代码重复,如果可以的话,它也是避免早期
return
s的好方法。但我还是会向您展示代码:

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()  
输出

0
1
0
1
0
1
0
1
0
1
顺便说一句,通常的Python约定是对简单变量和函数名使用小写。类名使用大写和CamelCase名称。当然,您不必遵循这个约定,但是如果您不遵循这个约定,那么在大多数语法高亮显示软件中查看代码时,它会使代码看起来很奇怪,因此对Python社区的其他成员来说,这是不必要的混淆

有关详细信息,请参阅


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

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

Turn = 1
for i in range(10):
    SomeFunction()  
这将产生与以前相同的输出

如果一个变量只接受0和1的值,则应该考虑用布尔值来代替,并且在<代码> false 和<代码>真< /代码>之间交替,因为这会导致更多的可读代码。您可以将其替换为:

Turn = not Turn

你可以在算术表达式中使用布尔值,它的行为将类似于0或1,尽管有些人不喜欢这样做,并且认为它不可读。

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

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

处理这个问题的明智方法是使用
elif
,正如其他人所提到的那样。或者,您可以将
打印
复制到两个分支中,并将早期的
返回
放在第一个分支中。
elif
方法更好,因为它避免了代码重复,如果可以的话,它也是避免早期
return
s的好方法。但我还是会向您展示代码:

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()  
输出

0
1
0
1
0
1
0
1
0
1
顺便说一句,通常的Python约定是对简单变量和函数名使用小写。类名使用大写和CamelCase名称。当然,您不必遵循这个约定,但是如果您不遵循这个约定,那么在大多数语法高亮显示软件中查看代码时,它会使代码看起来很奇怪,因此对Python社区的其他成员来说,这是不必要的混淆

有关详细信息,请参阅


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

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

Turn = 1
for i in range(10):
    SomeFunction()  
这将产生与以前相同的输出

如果一个变量只接受0和1的值,则应该考虑用布尔值来代替,并且在<代码> false 和<代码>真< /代码>之间交替,因为这会导致更多的可读代码。您可以将其替换为:

Turn = not Turn

你可以在算术表达式中使用布尔值,它的行为将类似于0或1,尽管有些人不喜欢这样做,并且认为它不可读。


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

用笔和纸来完成执行过程。是,结果将始终为
1
。也许你想第二次使用
elif
。用笔和纸来完成执行。是,结果将始终为
1
。也许你想第二次使用一个
elif
。啊,我明白了,我通常使用elif,但我认为在这种情况下不需要它,但回头看,这是相当愚蠢的。顺便说一句,我使用大写变量,因为我认为它们更易于阅读,但感谢您指出这一点。我试图遵循PEP,但从未想过如何命名变量:)@HarmPrins:FWIW,实际上有一种更有效的方法可以在0和1之间翻转变量。我将在我的答案中添加更多的代码。这似乎是一个有效的解决方案,但在我的例子中,我根据Turn变量运行代码的不同部分。我也总是试图避免全局变量,但在这种情况下,我无法避免它。我正在使用Tkinter