假设我们有一个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 的主要思想是不要每次都向该函数传递很多变量
答案 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