Pernyataan impor Python dalam satu lingkaran: apakah impor menjalankan setiap iterasi loop?

Untuk kode yang saya tulis, saya menjalankan scipy.curve_fit() puluhan ribu kali. Saya perhatikan di kode sumber curve_fit() yang relevan, khususnya pada baris 430 dan 431 di sumber (dalam fungsi leastsq()), ada dua pernyataan import:

from numpy.dual import inv
from numpy.linalg import LinAlgError

Saya memanggil curve_fit() di dalam satu lingkaran. Saya bertanya-tanya apakah modul yang dimuat oleh pernyataan import ini disimpan setelah iterasi loop selesai atau apakah modul berada di luar cakupan dan perlu dimuat ulang di setiap iterasi loop.

Catatan: pernyataan import hanya dipanggil jika pernyataan if full_output: pada baris 427 kode sumber bernilai benar. full_output=1 adalah apa yang diteruskan ke leastsq() oleh curve_fit(), sehingga pernyataan import memang disebut.

Catatan tambahan: Saya tidak bertanya tentang mengimpor modul beberapa kali (begitu banyak), melainkan apakah modul yang diimpor dalam satu perulangan masih dapat diakses oleh kode setelah perulangan selesai (atau setelah setiap iterasi dari lingkaran).

Catatan lebih lanjut:

>>>for x in range(0,1):
...     import os
... 
>>> os
<module 'os' from '/home/lars/env/common/lib64/python2.7/os.pyc'>

ini berfungsi, tetapi jika saya mendefinisikan suatu fungsi:

def a(b):
    if a==True:
       import scipy

Kemudian

for i in range(10):
   a(True)
scipy
NameError: name 'scipy' is not defined

Ada apa dengan itu?


person NeutronStar    schedule 15.06.2015    source sumber
comment
Kemungkinan duplikat: stackoverflow.com/questions/296036/, stackoverflow.com/questions/12487549/   -  person ev-br    schedule 15.06.2015
comment
@ ev-br, pertanyaan-pertanyaan itu tidak sesuai dengan yang saya tanyakan. Saya pada dasarnya bertanya apakah modul yang diimpor dalam sebuah loop berada di luar cakupan ketika iterasi loop berakhir, atau apakah kode tersebut menyimpannya.   -  person NeutronStar    schedule 15.06.2015


Jawaban (1)


Perilaku ini tidak ada hubungannya dengan loop, ini semua tentang fungsi ini. Seperti yang dikatakan dokter,

Pernyataan import dasar (klausa no from) dijalankan dalam dua langkah: menemukan modul, memuat dan menginisialisasi modul tersebut jika perlu, menentukan nama atau beberapa nama di namespace lokal untuk cakupan tempat pernyataan import terjadi.

Dan fungsi memang memiliki cakupannya sendiri, itulah mengapa Anda tidak dapat melihat modul yang diimpor di luarnya.

https://docs.python.org/3/reference/simple_stmts.html#the-import-statement

person Cassum    schedule 15.06.2015