首页 > 解决方案 > 在多个文件中使用但在函数调用后未更改的全局变量(Python)

问题描述

我在 settings.py 模块中声明了一个全局变量:

def init():
    global grid
    grid = [[0,0,0,0,0,0,1,4,3],
            [9,0,0,0,0,0,0,0,0],
            [0,0,2,0,4,5,0,8,0],
            [0,0,0,0,0,3,0,1,0],
            [0,6,0,4,9,1,0,5,0],
            [0,4,0,6,0,0,0,0,0],
            [0,8,0,7,5,0,4,0,0],
            [0,0,0,0,0,0,0,0,8],
            [2,1,5,0,0,0,0,0,0]]

我还有一个名为 run.py 的模块,其中包含一个应该修改网格的函数:

import numpy
import settings

def solve():

    for x in range(9):
        for y in range(9):
            if settings.grid[x][y] == 0:
                for number in range(1,10):
                    if possible(x,y,number): #function described in this file, not usefull here
                        settings.grid[x][y] = number
                        solve()
                        settings.grid[x][y] = 0
                return

    print("Solved sudoku in solve():\n{}\n".format(numpy.matrix(settings.grid))) #2nd output

在我的 main.py 中,我首先通过调用 settings.init() 来初始化 settings.grid。之后,我基本上从 settings.py 打印网格变量,然后调用 run.solve() 对其进行修改(它正在工作,因为第二个输出将替换 0),然后重新打印 settings.grid 以查看变量是否相应更改到第二个输出:

import numpy
import settings
import run


settings.init()

print("Inserted sudoku:\n{}\n".format(numpy.matrix(settings.grid)))

run.solve()

print("Solved sudoku:\n{}\n".format(numpy.matrix(settings.grid)))

我的问题是,第三个输出没有像第二个一样采用相同的 settings.grid 值,就像 run.solve() 甚至没有被调用一样!

这是我得到的输出:

1st output 
Inserted sudoku:
[[0 0 0 0 0 0 1 4 3]
 [9 0 0 0 0 0 0 0 0]
 [0 0 2 0 4 5 0 8 0]
 [0 0 0 0 0 3 0 1 0]
 [0 6 0 4 9 1 0 5 0]
 [0 4 0 6 0 0 0 0 0]
 [0 8 0 7 5 0 4 0 0]
 [0 0 0 0 0 0 0 0 8]
 [2 1 5 0 0 0 0 0 0]]

2nd output
Solved sudoku in solve():
[[6 5 8 9 2 7 1 4 3]
 [9 3 4 1 6 8 2 7 5]
 [1 7 2 3 4 5 9 8 6]
 [8 2 9 5 7 3 6 1 4]
 [7 6 3 4 9 1 8 5 2]
 [5 4 1 6 8 2 3 9 7]
 [3 8 6 7 5 9 4 2 1]
 [4 9 7 2 1 6 5 3 8]
 [2 1 5 8 3 4 7 6 9]]

3rd output
Solved sudoku:
[[0 0 0 0 0 0 1 4 3]
 [9 0 0 0 0 0 0 0 0]
 [0 0 2 0 4 5 0 8 0]
 [0 0 0 0 0 3 0 1 0]
 [0 6 0 4 9 1 0 5 0]
 [0 4 0 6 0 0 0 0 0]
 [0 8 0 7 5 0 4 0 0]
 [0 0 0 0 0 0 0 0 8]
 [2 1 5 0 0 0 0 0 0]]

你知道我怎样才能像第二个一样获得第三个输出吗?换句话说,您知道在 run.solve() 调用后如何更改我的 main.py 中要更改的 settings.grid 值吗?

提前致谢

标签: pythonrecursionglobal-variables

解决方案


我尽可能地复制了你的情况,我想我得到了想要的结果。这就是我所做的

设置.py

def init():
    global grid
    grid = [0, 0]

更新为有一些递归

运行.py

import settings

def solve(i = 1):
    if i >= 0:
        settings.grid[i] = i + 1
        solve(i - 1)

主文件

import settings
import run

settings.init()

print(settings.grid)

run.solve()

print(settings.grid)

的输出是:

[0, 0]
[1, 2]
>>> 

注意:在递归调用之后的代码中,您将位置设置回0,这可能不是您的问题,但我认为您必须检查一下。

settings.grid[x][y] = number
solve()
settings.grid[x][y] = 0 # <==== Right here

推荐阅读