Глобальная переменная, используемая в нескольких файлах, но не измененная после вызова функции (Python) - PullRequest
0 голосов
/ 30 марта 2020

Я объявил глобальную переменную в своем модуле 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.grid, вызывая settings.init (). После этого я в основном печатаю переменную сетки из settings.py, затем вызываю run.solve (), чтобы изменить ее (это работает, так как 2-й вывод заменит 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]]

Есть ли у вас какие-либо идеи о том, как я могу получить 3-й выход, как 2-й? Другими словами, знаете ли вы, как я могу изменить значение settings.grid для изменения в моем main.py после вызова run.solve ()?

Заранее спасибо

1 Ответ

0 голосов
/ 30 марта 2020

Я воспроизвел как можно вашу ситуацию и думаю, что получу желаемый результат. Это то, что я сделал

settings.py

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

Обновлен , чтобы иметь некоторую рекурсию

run.py

import settings

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

main.py

import settings
import run

settings.init()

print(settings.grid)

run.solve()

print(settings.grid)

И вывод new :

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

Примечание : в вашем коде после рекурсивного вызова Вы устанавливаете позицию обратно на 0, это может быть не вашей проблемой, но я думаю, что вы должны это проверить.

settings.grid[x][y] = number
solve()
settings.grid[x][y] = 0 # <==== Right here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...