2012-06-12 36 views
6

phép nói rằng tôi có một mô hình python fibo.py được xác định như sau:Python: Nhập khẩu Mô-đun

#Fibonacci numbers module 
print "This is a statement" 
def fib(n): 
    a,b = 0,1 
    while b < n: 
     print b 
     a, b = b, a+b 

def fib2(n): 
    a,b = 0,1 
    result= [] 
    while(b < n): 
     result.append(b) 
     a, b = b, a+b 
    return result 

Trong phiên dịch viên của tôi, tôi làm như sau:

>> import fibo 
This is a statement 
>>> fibo.fib(10) 
1 
1 
2 
3 
5 
8 

>>> fibo.fib2(10) 
[1, 1, 2, 3, 5, 8] 
>>> fibo.__name__ 
'fibo' 
>>> 

Cho đến nay rất tốt. .restart người phiên dịch:

>>> from fibo import fib,fib2 
This is a statement 
>>> fibo.__name__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'fibo' is not defined 
>>> 

tôi mong đợi các lỗi như tôi đã chỉ nhập khẩu fib và fib2. Nhưng tôi không hiểu tại sao câu lệnh được in ra khi tôi chỉ nhập khẩu fib và fib2.

Thứ hai nếu tôi thay đổi các module như:

#Fibonacci numbers module 
print "This is a statement" 
print __name__ 

gì phải là kết quả mong đợi?

+0

bạn có thể sử dụng một hàm duy nhất với 'yield b': 1.' cho f trong fib (n): print f' 2. 'result = list (fib (n))' – jfs

Trả lời

9

Đây là hành vi được mong đợi. Khi bạn nhập với from X import Y, mô-đun vẫn được tải và thực hiện, như được ghi trong Language Reference. Thực tế, khi bạn làm

from fibo import fib 
print("foo") 
import fibo 

sẽ in This is a statement, tiếp theo là foo. Thứ hai import không in bất kỳ thứ gì vì mô-đun đã được lưu trong bộ nhớ cache.

Mô-đun thứ hai của bạn sẽ in This is a statement theo sau là fibo. Module này biết tên riêng của nó tại thời gian tải.

+0

Nhập thứ hai sẽ chỉ in nếu module được tải lại bằng cách sử dụng 'reload()' phía trên dòng thứ ba. –

2

Python phải tải toàn bộ mô-đun để nhập bất kỳ thứ gì từ nó. Python nhập toàn bộ mô-đun vào bộ nhớ cache của mô-đun, nhưng chỉ các ký hiệu bạn nhập mới hiển thị cho bạn. (Nếu bạn nhập lần thứ hai, nó sẽ không chạy; điều này là do mô-đun được lưu vào bộ nhớ cache khi lần đầu tiên được nhập.)

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