Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中的循环中导入某些内容会产生什么副作用?_Python_Python 3.x_For Loop_Python Import - Fatal编程技术网

在python中的循环中导入某些内容会产生什么副作用?

在python中的循环中导入某些内容会产生什么副作用?,python,python-3.x,for-loop,python-import,Python,Python 3.x,For Loop,Python Import,我一直在维护一个项目。我发现有人写了一个函数,他在for循环中做了一个import语句,就像这样 for obj in obj_list: from Levenshtein._levenshtein import distance if distance(obj.title, "some string") <= 2: do something 我假设在for循环中导入某些内容会导致不必要的指令执行。因此,我想重构代码。但要做到这一点,我需要一个理由来支持我

我一直在维护一个项目。我发现有人写了一个函数,他在for循环中做了一个import语句,就像这样

for obj in obj_list:
    from Levenshtein._levenshtein import distance
    if distance(obj.title, "some string") <= 2:
        do something
我假设在for循环中导入某些内容会导致不必要的指令执行。因此,我想重构代码。但要做到这一点,我需要一个理由来支持我的假设,即在for循环中导入不是一个好做法。我的假设正确吗?

只需将导入移出循环即可。您是正确的,因为这会在每次迭代中给Python带来一些额外的工作

Python导入语句完成两件事:

检查引用的模块是否已加载,如果未加载,则加载它。 绑定指定一个或多个名称。 因此,每次循环迭代Python都会检查模块是否已经加载,大致相当于检查sys.modules中的'Levenshtein.\u Levenshtein',然后设置名称距离

如果循环中没有其他内容将名称距离设置为其他内容,则可以安全地将导入移出循环并保存这些检查。如果有这样的代码,那么重构它以不使用相同的名称,并将导入移出循环。

只需将导入移出循环即可。您是正确的,因为这会在每次迭代中给Python带来一些额外的工作

Python导入语句完成两件事:

检查引用的模块是否已加载,如果未加载,则加载它。 绑定指定一个或多个名称。 因此,每次循环迭代Python都会检查模块是否已经加载,大致相当于检查sys.modules中的'Levenshtein.\u Levenshtein',然后设置名称距离


如果循环中没有其他内容将名称距离设置为其他内容,则可以安全地将导入移出循环并保存这些检查。如果有这样的代码,那么重构它,使其不使用相同的名称,并将导入移出循环。

不要假设。搜索SO:我在谷歌上搜索了很多次python导入模块——还有很多其他的SO点击。。。在for循环中导入的可能重复不是一个好的做法,因为它会导致更混乱的代码,但在功能上对程序的行为没有影响。如果您有充分的理由只在循环内导入,例如,一个包在导入时会产生副作用或需要很长时间才能加载,并且您不想不必要地获取,那么您仍然可以这样做,但应尽可能避免这样做。@jdehesa:这是另一个绑定操作。如果循环中的其他代码执行distance=*其他操作*,则导入会将函数重新分配给相同的名称。这需要一些重构来避免重复使用这个名字,真的。不要假设。搜索SO:我在谷歌上搜索了很多次python导入模块——还有很多其他的SO点击。。。在for循环中导入的可能重复不是一个好的做法,因为它会导致更混乱的代码,但在功能上对程序的行为没有影响。如果您有充分的理由只在循环内导入,例如,一个包在导入时会产生副作用或需要很长时间才能加载,并且您不想不必要地获取,那么您仍然可以这样做,但应尽可能避免这样做。@jdehesa:这是另一个绑定操作。如果循环中的其他代码执行distance=*其他操作*,则导入会将函数重新分配给相同的名称。如果python解释器在每次迭代中都做一些额外的工作,这正是我想要的。正如您所说,它会检查引用的模块是否已加载,如果未加载,则加载它。这就回答了我的问题。这正是我想要的——如果python解释器在每次迭代中都做一些额外的工作的话。正如您所说,它会检查引用的模块是否已加载,如果未加载,则加载它。这回答了我的问题。