我在python中有一个程序。该计划的一部分是:
suggestengines = get_suggestengines(suggestengines)
sleeptimer = sleepcount * len(suggestengines)
seeds = get_seeds(dummydata=False)
为了进一步编程,我想做一个函数:
def first_step():
suggestengines = get_suggestengines(suggestengines)
sleeptimer = sleepcount * len(suggestengines)
seeds = get_seeds(dummydata=False)
现在我收到一条错误的“suggestengines”,我想传递给get_suggestengines()。睡眠计时器和种子也会得到一个标记,我不会在程序的其余部分使用它们。我用Google搜索并得到答案:我们全球化。所以我为所有内容添加了全局
def first_step():
global suggestengines
global sleeptimer
global seeds
suggestengines = get_suggestengines(suggestengines) #which engines to run?
sleeptimer = sleepcount * len(suggestengines)
seeds = get_seeds(dummydata=False)
在程序的另一部分我有
for seed in tqdm(seeds, leave=True):
程序在tqdm中给我一个错误种子。如果我改变它也可以像它一样:
def partTwo():
for seed in tqdm(seeds, leave=True):
然后我不再收到错误,虽然我没有使用全局。有人可以解释我为什么以及我是否还需要在第2部分中使用全局?
答案 0 :(得分:2)
seeds
尚未初始化,因为它的初始化是尚未被调用的def
的一部分。如果你把for循环放在def
里面,那么它将按你调用函数的顺序调用,所以解释器不会抱怨直到你实际使用它。
这里唯一要记住的是:在初始化后使用变量。
答案 1 :(得分:2)
声明
global <identifier>
告诉python <identifier>
在分配中使用时应引用全局。这在更改全局变量的函数中是必需的,因为Python在声明变量和分配给现有变量之间没有语法差异。 python中的默认设置是让函数中的赋值创建新变量,而不是更改全局状态。
当您从变量中读取时,没有语法歧义,因此Python将使用它找到的任何变量(即全局,如果没有本地变量)。
示例:
a = 1
def foo():
a = 2 # this will create a new, local variable a
def bar():
global a # "when I refer to a, I mean the global one"
a = 2 # this will change the global variable a
如果不存在具有指定名称的全局,则global
语句本身不会创建新的全局变量,但任何后续赋值都将。例如。给出以下内容:
def x():
global c
def y():
global c
c = 1
def z()
print c
x(); z()
会出错(全局名称'c'未定义),而y(); z()
会打印1
。