python 3中导入函数的范围是什么

时间:2019-04-30 12:33:48

标签: python python-3.x

假设我们有一个python脚本,其中包括:

def add(a):
   a += b
   print(a)
b=5
add(3)

此输出:8

但是如果我们从另一个python文件add导入函数some_utils.py

from some_utils.py import add

b=5
add(3)

这会返回错误,提示未定义b

如何解决这个问题?

PS 的主要思想是不要每次都向该函数传递很多变量

5 个答案:

答案 0 :(得分:3)

b中的自由变量add指向模块中的全局b,其中add定义的,而不是其中它最终被称为。以下将起作用:

from some_utils import add
import some_utils

some_utuils.b = 5  # Set the variable add() looks for
add(3)

更好的解决方案可能是使用闭包:

def make_add(b):
    def add(a):
        a += b
        print(a)
    return add

然后

from some_utils import make_add

add = make_add(5)
add(3)

答案 1 :(得分:2)

您不导入变量b,仅导入add函数。在此函数的单独范围内,b确实不存在。它仅存在于外部模块的范围内,并且这里有两个隔离的b变量。将第二个传递给add函数的唯一方法是通过参数

导入的变量(或函数/模块/类)的作用域与开始导入的作用域相同(导入不必位于文件的顶部),但这与您的错误无关

答案 2 :(得分:0)

为什么不使用默认参数!

def add(a, b=5):
   a += b
   print(a)

#If b is not passed, default value of 5 is used
add(3)
#If b is passed, the value of 6 is used
add(3, 6)

输出将为

8
9

b不在脚本外部定义,这就是为什么您不能在脚本外部访问,如果您想在脚本外部访问,也可以这样做(感谢L3viathan的建议)

from some_utils.py import add, b
add(3,b)

答案 3 :(得分:0)

您希望b来自哪里? 5是您经常使用的吗?然后将其作为默认值:

def add(a, b=5):
    ...

是否要采用在模块中定义的b值以及函数?不仅导入函数:

from some_utils.py import *

是否要在其他文件中定义b,而不将其传递给函数?使用全局变量:

def add(a):
    global b
    print(str(a+b))

答案 4 :(得分:0)

导入的函数只能看到导入的变量。

您可以使用默认参数来绑定来自外部模块的值:

some_utils.py:

b = 5
def add(a, b=b):
    return a + b

其他脚本:

from some_utils import add
print(add(4))  # prints 9