Python:更多地了解全局

时间:2016-05-06 11:56:42

标签: python

我在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部分中使用全局?

2 个答案:

答案 0 :(得分:2)

到达for循环时,

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