2016-08-25 7 views
18

Widzę zachowanie w języku Python, którego nie rozumiem. Rozważmy następujący układ:Zaimportowano moduł Pythona; dlaczego przeniesienie członka do niego wpływa również na import w innym miejscu?

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' 

tak, python main.py produce:

initial_value 
test1 
test1 

jestem zdezorientowany ostatniej linii. Myślałem, że znowu wydrukuje initial_value, ponieważ ponownie importuję config.py w test2.py i myślałem, że zmiany, które wprowadziłem w poprzednim kroku, zostaną nadpisane. Czy coś nie rozumiem?

+0

Spróbuj "przeładować" (conf) 'gdzieś pomiędzy i zwróć uwagę na różnicę. Załadowane moduły są buforowane. Kiedy ładujesz 'conf' w' test? .py', dostajesz odniesienie do już załadowanego modułu. – dhke

+0

Uważam, że obecnym odpowiedziom brakuje stanu, ponieważ importowanie modułu nie powoduje wykonania skryptu; jak słusznie wskazano, Python buforuje moduły. – Petar

Odpowiedz

27

Python buforuje importowane moduły. Drugie wywołanie import nie powoduje ponownego załadowania pliku.

+0

Jeśli chcesz sprawdzić, 'sys.modules' zawiera odniesienia do wszystkich importowanych buforów. –

+1

I przeładowanie można wykonać, wywołując 'reload (conf)' dla Python2 lub 'importlib.reload (conf)' dla Python3. –

4

Edytowałeś test_var w test1.py, a następnie drukowałeś go ponownie, używając test2.py. Importowanie ponownie nie zmienia faktu, że przypisałeś nową wartość do zmiennej - nie "resetuje" wartości do pierwszej.

1

Nie, zmieniasz z test1() w config.py stałą wartością. To nie zostanie zresetowane. Ponieważ wydrukujesz go w numerze test2(), zmodyfikowana wartość zostanie wydrukowana ponownie.

4

Zmieniłeś wartość test_var po uruchomieniu test1, a więc została już zmieniona po uruchomieniu test2.

Ta zmienna nie zostanie zresetowana dla każdego pliku, do którego zostanie zaimportowana. Będzie to jedna wartość dla wszystkiego.

8

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)) 

Zmień kod w taki sposób.

I uruchomić main.py

initial_value 
140007892404912 
test1 
140007892404912 
test1 

Tak, można zobaczyć, że w obu przypadkach są zmiany wartości tej samej zmiennej. Zobacz te id są takie same.

Powiązane problemy