Python 在函数内部更改时不保存变量值

Python not saving variable values when they are changed inside a function

我在程序开始时保存了我的变量,我相信允许函数访问它们,但是当它们 运行 函数重复时,值不会被保存。

P1_score = 0
P2_score = 0
round_number = 0

def dice_rolling():
    # P1D1 means player ones dice one value and so on with P1D2
    import random
    # player ones turn
    print("player ones turn")
    P1D1 = random.randint(1, 6)
    print("your number is ", P1D1)
    P1D2 = random.randint(1, 6)
    print("your second number is", P1D2)
    # player twos turn
    print("player twos turn")
    P2D1 = random.randint(1, 6)
    print("your number is", P2D1)
    P2D2 = random.randint(1, 6)
    print("your second number is", P2D2)
    score_calculation(P1D1, P1D2, P2D1, P2D2,P1_score,P2_score,round_number)


def score_calculation(P1D1, P1D2, P2D1, P2D2,P1_score,P2_score,round_number):
    import random
    
    round_number = round_number + 1
    # player 1 score calculation
    total_P1 = P1D1 + P1D2
    P1_score = P1_score + total_P1
    if total_P1 % 2 == 0:
        P1_score = P1_score + 10
    else:
        P1_score = P1_score + 5
    if P1D1 == P1D2:
        P1D3 = random.randint(1, 6)
        P1_score = P1_score + P1D3

    # player 2 score calculation
    total_P2 = P2D1 + P2D2
    P2_score = P2_score + total_P2
    if total_P2 % 2 == 0:
        P2_score = P2_score + 10
    else:
        P2_score = P2_score + 5
    if P2D1 == P2D2:
        P2D3 = random.randint(1, 6)
        P2_score = P2_score + P2D3
    print("player ones score at the end of round", round_number, "is", P1_score)
    print("player twos score at the end of round",round_number,"is",P2_score)

    
for x in range(0,5):
    dice_rolling() 

任何帮助将不胜感激,如果有人能简单解释一下我做错了什么以及要解决什么问题,那就太好了。

Python 可以从函数内部的全局变量中读取,但是如果不做一些额外的工作就不能给它们赋值。一般来说,当你想使用全局变量时,最好在你的函数中使用 global 关键字使其显式化:

my_global_var = 0

def some_function():
    global my_gobal_var
    
    my_global_var = 10

print(my_global_var) # it prints 10

somefunction() # modifies the global var

print(my_global_var) # now it prints 10

变量在本地定义和使用。考虑这个例子。

x = 1 #initial value
def test(x):
    print(x) #print what you got
    x += 1
    print(x) #print updated value

print(x) #Actual printouts here
test(x)
print(x)

这导致:

1 
1 #value when entering the function
2 #Value changed by function
1 #value outside the function did not change

如果希望变量在函数中维护,可以考虑使用class变量或全局变量。 (我建议在遇到更复杂的问题时避免使用全局变量)

全局示例:

global x
x = 1
def test():
    global x
    x+=1
print(x)
test()
print(x)
test()
print(x)

结果:

1
2
3

最后class个变量:

class test_class():
    def __init__(self):
        self.x = 1 #variables defined like this are class variables
    def test(self):
        self.x += 1 #Advantages of class variables is that you can defined them in the __init__ function
    def running(self):
        print(self.x) # And you can access it from multiple functions without using globals and much more too. 
        self.test()
        print(self.x)


if __name__ == '__main__':
    tclass = test_class()
    tclass.running()