首页 > 解决方案 > 有没有办法创建在多个循环期间不会重置的变量?

问题描述

我最近一直在尝试编写一个代码,试图找出一个函数返回 1 的次数。

fin=open("gymnastics.in", 'r')
p=(fin.readline().split())
n=int("".join(map(str, p)))
rank=[]
for i in range(3):
    line=fin.readline().strip().split()
    rank.append([int(num) for num in line])
print(rank[1])

def good_pair(cow1, cow2):
    global x
    x=0
    for i in range(3):
        if rank[0].index(cow1)<rank[0].index(cow2) and rank[1].index(cow1)<rank[1].index(cow2) and rank[2].index(cow1)<rank[2].index(cow2):
            return 0
        elif rank[0].index(cow1)>rank[0].index(cow2) and rank[1].index(cow1)>rank[1].index(cow2) and rank[2].index(cow1)>rank[2].index(cow2):
            x=x+1
            return x
        else:
            return 0


print(good_pair(4, 3))
print(good_pair(4, 2))
print(good_pair(4, 1))
print(good_pair(3, 2))
print(good_pair(3, 1))
print(good_pair(2, 1))
print(good_pair(3, 4))
print(good_pair(2, 4))
print(good_pair(1, 4))
print(good_pair(2, 3))
print(good_pair(1, 3))
print(good_pair(1, 2))

这里我有 x 作为变量,但每次我调用函数时,x 的值都会被重置。有没有办法让它不重置并继续添加?

标签: pythonfunctionvariables

解决方案


你想保存状态。一种方法是向函数添加一个参数以传递x. 在第一次调用时,使用默认值。在以后的调用中,使用最后返回的值。这通常比仅使用全局变量更好,因为代码的其他位可以使用相同的函数而不会相互干扰。

def good_pair(cow1, cow2, x=0):
    for i in range(3):
        if rank[0].index(cow1)<rank[0].index(cow2) and rank[1].index(cow1)<rank[1].index(cow2) and rank[2].index(cow1)<rank[2].index(cow2):
            return 0
        elif rank[0].index(cow1)>rank[0].index(cow2) and rank[1].index(cow1)>rank[1].index(cow2) and rank[2].index(cow1)>rank[2].index(cow2):
            x=x+1
            return x
        else:
            return 0

foo = good_pair(4, 3)
print(foo)
foo = good_pair(4, 2, foo)
print(foo)

类是保持状态的好方法。您可以将其更改为为您保留价值的类x

class GoodPair:

    def __init__(self):
        self.x = 0
        
    def __call__(self, cow1, cow2):
        for i in range(3):
            if rank[0].index(cow1)<rank[0].index(cow2) and rank[1].index(cow1)<rank[1].index(cow2) and rank[2].index(cow1)<rank[2].index(cow2):
                return 0
            elif rank[0].index(cow1)>rank[0].index(cow2) and rank[1].index(cow1)>rank[1].index(cow2) and rank[2].index(cow1)>rank[2].index(cow2):
                self.x += 1
                return self.x
            else:
                return 0

good_pair = GoodPair()
print(good_pair(4, 3))
print(good_pair(4, 2))

__call__当您将类实例视为函数时使用该方法。


推荐阅读