如何在函数中通过参数全局增加Python中的值?

-1 投票
2 回答
54 浏览
提问于 2025-04-14 18:23

变量 genreIndex 只会在这个函数内部增加,而不会在全局范围内增加。有没有办法让它变成全局变量呢?我试着把一个全局变量赋值给 index。

genreList = [4.25, 4, 5, 5, 5, 4.35, 5, 4.5, 3.75, 3.75, 4.75, 5, 5, 5, 4, 4.75, 3.75, 2.75, 5, 5, 4, 3.5, 5, 3.25, 2.5, 5, 3, 4.75, 5, 4, 5, 2, 5, 5, 5, 2.5, 3.25, 0, 4.25, 4, 5, 0, 5, 4.25, 4, 5, 2.5, 5, 4.5, 3.5, 3.25, 4, 1, 3.5, 4, 5, 3, 2.75, 4.5, 3, 5, 0.5, 3, 4, 0, 3.5, 3.25, 3.5, 5, 4, 5, 3.5, 5, 3.5, 3, 4.5, 4.5, 5, 3, 4.75, 3.5, 3.75, 4.5, 4, 3.5, 3.75, 4.5, 5, 5, 3.5, 4.5, 5, 4, 4.5, 5, 4, 3.75, 5, 4.5, 4.5, 3.75, 3.5, 3.75, 3.5, 5, 4.5, 5, 3.5, 4.25, 5, 4, 3.25, 3.5, 2.5, 4, 3.5, 3.75, 0, 3.5, 5, 4.5, 0, 4, 4.25, 5, 4, 3.5, 1.5, 2.5]
genreIndex = 0
def reset(index, list):
    global x
    index = index + 1
    x = index
    print(x)
    if index > (len(list) - 1):
        index = 0
 
    if index < 0:
        index = len(list)
    print(list[x])
    
reset(genreIndex, genreList)
reset(genreIndex, genreList)
reset(genreIndex, genreList)

2 个回答

0

当Python调用reset时,它会获取一个新的指向genreIndex中值的引用,并把这个匿名的引用传递给函数。reset并不知道这个值是来自genreIndex的。整数是不可变的,所以在函数中改变index会创建一个新的对象,而这个新对象无法直接赋值回全局的值,除非有更多的信息。

假设你希望reset能够处理任意数量的列表和索引,解决这个问题的常见方法是返回新的数字。调用这个函数的人知道哪个变量对应哪个值,然后可以进行相应的赋值。

genreIndex = 0
def reset(index, list):
    index = index + 1
    if index > (len(list) - 1):
        index = 0
    if index < 0:
        index = len(list)
    print(list[x])
    return index
    
genreIndex = reset(genreIndex, genreList)
genreIndex = reset(genreIndex, genreList)
genreIndex = reset(genreIndex, genreList)

你还可以创建一个类,把索引和单个类型的列表关联起来。一旦这个类被实例化,它的方法就不再需要明确地引用索引或列表了。

class Genre:

    def __init__(self, genre_list):
        self.genre_list = genre_list
        self.index = 0
        
    def reset(self):
        self.index += 1
        if self.index > (len(self.genre_list) - 1):
            self.index = 0
        if self.index < 0:
            self.index = len(self.genre_list)
        print(self.genre_list[self.index])
        
genre = Genre(genreList)
genre.reset()
genre.reset()
0

为了让 genreIndex 成为一个全局变量,并确保它的变化在全局范围内都能被看到,你需要在你的函数里把它声明为全局变量,像这样:

genreList = [4.25, 4, 5, 5, 5, 4.35, 5, 4.5, 3.75, 3.75, 4.75, 5, 5, 5, 4, 4.75, 3.75, 2.75, 5, 5, 4, 3.5, 5, 3.25, 2.5, 5, 3, 4.75, 5, 4, 5, 2, 5, 5, 5, 2.5, 3.25, 0, 4.25, 4, 5, 0, 5, 4.25, 4, 5, 2.5, 5, 4.5, 3.5, 3.25, 4, 1, 3.5, 4, 5, 3, 2.75, 4.5, 3, 5, 0.5, 3, 4, 0, 3.5, 3.25, 3.5, 5, 4, 5, 3.5, 5, 3.5, 3, 4.5, 4.5, 5, 3, 4.75, 3.5, 3.75, 4.5, 4, 3.5, 3.75, 4.5, 5, 5, 3.5, 4.5, 5, 4, 4.5, 5, 4, 3.75, 5, 4.5, 4.5, 3.75, 3.5, 3.75, 3.5, 5, 4.5, 5, 3.5, 4.25, 5, 4, 3.25, 3.5, 2.5, 4, 3.5, 3.75, 0, 3.5, 5, 4.5, 0, 4, 4.25, 5, 4, 3.5, 1.5, 2.5]

def reset(index_var, lst):
    global x
    x = index_var + 1
    if x >= len(lst):
        x = 0
    print(lst[x])

x = 0
reset(x, genreList)
reset(x, genreList)
reset(x, genreList)

输出结果:

4
5
5

撰写回答