Подтвердить что ты не робот

Импортирован модуль Python; почему переназначение члена в нем также влияет на импорт в другом месте?

Я вижу поведение Python, которое я не понимаю. Рассмотрим этот макет:

project
|   main.py
|   test1.py
|   test2.py
|   config.py

main.py:

import config as conf
import test1
import test2

print(conf.test_var)
test1.test1()
print(conf.test_var)
test2.test2()

test1.py:

import config as conf

def test1():
    conf.test_var = 'test1'

test2.py:

import config as conf

def test2():
    print(conf.test_var)

config.py:

test_var = 'initial_value'

поэтому python main.py произведет:

initial_value
test1
test1

Меня смущает последняя строка. Я думал, что он снова напечатает initial_value, потому что я снова импортирую config.py в test2.py, и я подумал, что изменения, которые я сделал на предыдущем шаге, будут перезаписаны. Я что-то не понимаю?

4b9b3361

Ответ 1

Python кэширует импортированные модули. Второй вызов import не перезагружает файл.

Ответ 2

test2.py

import config as conf

def test2():
    print(id(conf.test_var))
    print(conf.test_var)

test1.py

import config as conf

def test1():
    conf.test_var = 'test1'
    print(id(conf.test_var))

Измените код следующим образом.

И запустите main.py

initial_value
140007892404912
test1
140007892404912
test1

Итак, вы можете видеть, что в обоих случаях вы меняете значение одной и той же переменной. См. Эти id.

Ответ 3

Вы отредактировали test_var в test1.py, а затем снова напечатали его, используя test2.py. Импорт снова не изменяет тот факт, что вы назначили новое значение переменной - это не "reset" значение для первого.

Ответ 4

Вы изменили значение test_var при запуске test1, и поэтому оно было изменено при запуске test2.

Эта переменная не будет reset для каждого файла, в который вы ее импортируете. Это будет одно значение для всего.

Ответ 5

нет, вы меняете с помощью test1() в config.py значение константы. Это не будет сброшено. Поскольку вы печатаете его в test2(), измененное значение снова печатается.