Мне нужна единственная копия var, которая ведет себя глобально: т. е. ее хранилище существует один раз, и все ссылки на него в обоих модулях читают и пишут одно и то же хранилище. Как я могу получить такое поведение, используя всего два модуля?
Вот моя попытка, но она с треском провалилась:
# module1
#!python
import module2
var = 1
def touch_var():
global var
print(var, id(var))
var = 3
print(var, id(var))
def main():
global var
print(var, id(var))
var = 2
print(var, id(var))
module2.do_func()
print(var, id(var))
touch_var()
print(var, id(var))
if __name__ == '__main__':
main()
# module2
#!python
import module1
def do_func():
print(module1.var, id(module1.var))
module1.touch_var()
print(module1.var, id(module1.var))
module1.var = 4
print(module1.var, id(module1.var))
Выход:
1 17006627360
2 17006627392
1 17006627360
1 17006627360
3 17006627424
3 17006627424
4 17006627456
2 17006627392
2 17006627392
3 17006627424
3 17006627424
Я пробовал то же самое, используя назначение с использованием изменяемых типов:
#!python
import module2
var = [1]
def touch_var():
global var
print(var, id(var))
var = [3]
print(var, id(var))
def main():
global var
print(var, id(var))
var = [2]
print(var, id(var))
module2.do_func()
print(var, id(var))
touch_var()
print(var, id(var))
if __name__ == '__main__':
main()
#!python
import module1
def do_func():
print(module1.var, id(module1.var))
module1.touch_var()
print(module1.var, id(module1.var))
module1.var = [4]
print(module1.var, id(module1.var))
и я получаю этот результат:
[1] 7696579790600
[2] 7696579792072
[1] 7696579790664
[1] 7696579790664
[3] 7696579790600
[3] 7696579790600
[4] 7696579790664
[2] 7696579792072
[2] 7696579792072
[3] 7696579790600
[3] 7696579790600
И я попытался присвоить элементу изменяемого типа:
#!python
import module2
var = [1]
def touch_var():
global var
print(var, id(var))
var[0] = 3
print(var, id(var))
def main():
global var
print(var, id(var))
var[0] = 2
print(var, id(var))
module2.do_func()
print(var, id(var))
touch_var()
print(var, id(var))
if __name__ == '__main__':
main()
#!python
import module1
def do_func():
print(module1.var, id(module1.var))
module1.touch_var()
print(module1.var, id(module1.var))
module1.var[0] = 4
print(module1.var, id(module1.var))
И я получаю этот результат:
[1] 7696579790600
[2] 7696579790600
[1] 7696579790664
[1] 7696579790664
[3] 7696579790664
[3] 7696579790664
[4] 7696579790664
[2] 7696579790600
[2] 7696579790600
[3] 7696579790600
[3] 7696579790600
Все три дают одинаковый результат.
Результат, который я хочу, таков:
1
2
2
2
3
3
4
4
4
3
3
Почему я получаю то, что получаю? Как я могу получить то, что хочу?
Обратите внимание, что это НЕ дубликат Python: совместное использование глобальных переменных между модулями и классами в нем, как предполагал @prune, потому что в этом случае ответ заключался в том, что проблема возникла из-за использования from module import *, чего я здесь не делаю; и альтернативный ответ заключался в том, что проблема возникла из-за использования неизменяемых типов, что, как я показал, не является проблемой. Кроме того, одним из моих критериев является решение этого вопроса с использованием двух файлов, но в этом вопросе используются три.