คำสั่งนำเข้า Python ในลูป: การนำเข้ารันการวนซ้ำทุกครั้งหรือไม่

สำหรับโค้ดที่ฉันกำลังเขียน ฉันกำลังรัน scipy.curve_fit() หลายหมื่นครั้ง ฉันสังเกตเห็นในซอร์สโค้ด curve_fit() ที่เกี่ยวข้อง โดยเฉพาะใน บรรทัด 430 และ 431 ใน แหล่งที่มา (ในฟังก์ชัน leastsq()) มีคำสั่ง import สองคำสั่ง:

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

ฉันโทร curve_fit() อยู่ในวง ฉันสงสัยว่าโมดูลที่โหลดโดยคำสั่ง import เหล่านี้จะถูกเก็บไว้เมื่อการวนซ้ำเสร็จสมบูรณ์หรือหากโมดูลอยู่นอกขอบเขตและจำเป็นต้องโหลดซ้ำในการวนซ้ำทุกครั้ง

หมายเหตุ: คำสั่ง import จะถูกเรียกก็ต่อเมื่อคำสั่ง if full_output: ในบรรทัด 427 ของซอร์สโค้ดประเมินเป็นจริง full_output=1 คือสิ่งที่ส่งผ่านไปยัง leastsq() โดย curve_fit() ดังนั้นคำสั่ง import จึงถูกเรียกจริงๆ

หมายเหตุเพิ่มเติม: ฉัน ไม่ได้ถามเกี่ยวกับการนำเข้าโมดูลหลายครั้ง (มาก) แต่หากโมดูลที่นำเข้าในลูปยังคงสามารถเข้าถึงได้ด้วยโค้ดหลังจากการวนซ้ำเสร็จสมบูรณ์ (หรือหลังจากการวนซ้ำแต่ละครั้งของ วนซ้ำ)

หมายเหตุเพิ่มเติม:

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

ใช้งานได้ แต่ถ้าฉันกำหนดฟังก์ชันแทน:

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

แล้ว

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

เกิดอะไรขึ้นกับสิ่งนั้น?


person NeutronStar    schedule 15.06.2015    source แหล่งที่มา
comment
รายการซ้ำที่เป็นไปได้: stackoverflow.com/questions/296036/, stackoverflow.com/questions/12487549/   -  person ev-br    schedule 15.06.2015
comment
@ ev-br คำถามเหล่านั้นไม่ใช่สิ่งที่ฉันถาม ฉันกำลังถามว่าโมดูลที่นำเข้าในลูปอยู่นอกขอบเขตเมื่อการวนซ้ำสิ้นสุดลงหรือโค้ดยังคงอยู่หรือไม่   -  person NeutronStar    schedule 15.06.2015


คำตอบ (1)


พฤติกรรมนี้ไม่เกี่ยวอะไรกับการวนซ้ำ มันเป็นเรื่องของฟังก์ชันนี้ ดังที่คุณหมอบอก

คำสั่งการนำเข้าพื้นฐาน (no from clause) ดำเนินการในสองขั้นตอน: ค้นหาโมดูล กำลังโหลดและเริ่มต้นโมดูลหากจำเป็น กำหนดชื่อหรือชื่อในเนมสเปซในเครื่องสำหรับขอบเขตที่คำสั่งนำเข้าเกิดขึ้น

และฟังก์ชันต่างๆ ก็มีขอบเขตของตัวเอง นั่นคือสาเหตุว่าทำไมคุณจึงไม่เห็นโมดูลที่นำเข้าภายนอกโมดูลนั้น

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

person Cassum    schedule 15.06.2015