2016-08-25 17 views
18

Tôi thấy hành vi của Python mà tôi không hiểu. Xem xét bố trí này:Nhập khẩu một mô-đun Python; tại sao việc gán lại một thành viên trong đó cũng ảnh hưởng đến việc nhập khẩu ở nơi khác?

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' 

vậy, python main.py sản:

initial_value 
test1 
test1 

Tôi bối rối bởi những dòng cuối cùng. Tôi nghĩ rằng nó sẽ in initial_value một lần nữa vì tôi đang nhập config.py trong test2.py một lần nữa và tôi nghĩ rằng những thay đổi mà tôi đã thực hiện trong bước trước đó sẽ bị ghi đè. Tôi có hiểu nhầm điều gì đó không?

+0

Thử 'tải lại (conf)' ở đâu đó ở giữa và lưu ý sự khác biệt. Mô-đun được tải được lưu vào bộ nhớ cache. Khi bạn tải 'conf' trong' test? .py', bạn chỉ cần tham chiếu đến mô-đun đã được nạp. – dhke

+0

Tôi nghĩ rằng những câu trả lời hiện tại bị thiếu trong trạng thái là việc nhập một mô-đun không thực thi tập lệnh mà nó nắm giữ; như được chỉ ra một cách chính xác, Python lưu trữ các mô-đun. – Petar

Trả lời

27

Python lưu trữ các mô-đun đã nhập. Cuộc gọi import thứ hai không tải lại tệp.

+0

Nếu bạn muốn kiểm tra, 'sys.modules' chứa tham chiếu đến tất cả các mục nhập được lưu trong bộ nhớ cache. –

+1

Và tải lại có thể được thực hiện bằng cách gọi 'reload (conf)' cho Python2 hoặc 'importlib.reload (conf)' cho Python3. –

4

Bạn đã chỉnh sửa test_var trong test1.py và sau đó chỉ in lại bằng cách sử dụng test2.py. Nhập lại không thay đổi thực tế so với khi bạn gán giá trị mới cho biến - nó không "đặt lại" giá trị thành giá trị đầu tiên.

1

không, bạn đang thay đổi với test1() trong config.py một giá trị không đổi. Điều này sẽ không được đặt lại. Vì bạn in nó trong test2(), giá trị sửa đổi được in lại.

4

Bạn đã thay đổi giá trị test_var khi bạn chạy test1 và do đó nó đã được thay đổi khi bạn chạy test2.

Biến đó sẽ không đặt lại cho mọi tệp bạn nhập tệp. Nó sẽ là một giá trị cho mọi thứ.

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

Thay đổi mã như thế này.

Và chạy main.py

initial_value 
140007892404912 
test1 
140007892404912 
test1 

Vì vậy, bạn có thể thấy rằng trong cả hai trường hợp bạn đang thay đổi giá trị của biến tương tự. Xem các số id này giống nhau.

Các vấn đề liên quan