我写了这段代码:
sample_array = ones ([N, 3], dtype = float)
def get_training_set ():
r = rand (N, 2) * 2 - 1
sample_array[:,[0,1]] = r
return sample_array
我在外面声明了采样数组,以便不是一直分配它,只是为了修改它 - 最后一个坐标总是为1。
最初我预计我必须在函数中插入一个语句“global sample_array”,因为我修改了它,因此评估者应该知道它是一个全局变量。
但是,令我惊讶的是,它没有“全球化”,效果很好。 为什么会起作用?在这种情况下评估的定义是什么?
答案 0 :(得分:1)
global
。如果您只是改变对象(例如,像上面所做的那样使用切片分配),那么不是是必要的。
确切的文档是here。
全局语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。
因此,使用全局语句,您告诉python该变量存在于全局上下文中。如果您为其分配,则更改全局上下文中的值。
如果不使用全局语句,python将决定变量是本地变量还是非本地变量。 (事实上,python3.x添加了一个nonlocal
关键字)。如果变量首先出现在赋值的右侧,或者您执行项目分配(x[...] = ...
)或属性赋值(x.whatever = ...
),则该变量是非本地变量。如果变量是本地的,那意味着它是在函数中创建的(或者是输入参数)。您可以直接重新分配到本地标识符,没有问题。如果变量是非本地的,你可以改变它,但你不能重新分配它,因为python无法确定变量是本地变量还是非本地变量。
答案 1 :(得分:0)
我认为这是因为sample_array未在函数内部声明,而只是写入。 Python在side function namespace中找不到sample_array,它会找到外部命名空间。 E.g。
a = []
def test1():
a.append(1) # will use the outer one
def test2():
a = []
a.append(1) # will use the inner one
Global,有时候,声明一个全局变量:
def declare_global():
global b # this should be global after 'declare_global()' is called
b = 1
print b # raise NameError: name 'b' is not defined
declare_global()
print b # will output '1'