2013-10-10 44 views
1

我写了这个代码:全球阵列 - 无需“全球”的声明

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”,因为我修改了它,因此评估者应该知道它是一个全局变量。

但是,令我惊讶的是,没有“全球”,它运行良好。 它为什么有效?在这种情况下评估的定义在哪里/什么?

回答

1

global是必要的,如果您要更改对象的引用(例如与赋值)。如果你只是对对象进行变异(例如像上面所做的切片分配),则需要而不是

准确的文档是here

全局声明是一个适用于整个当前代码块的声明。这意味着列出的标识符将被解释为全局变量。

因此,通过全局声明,您告诉python变量存在于全局上下文中。如果分配给它,则在全局上下文中更改该值。

如果不使用全局语句,python会决定变量是本地还是非本地。 (其实python3.x增加了一个关键字nonlocal)。如果变量首先出现在作业的右侧,或者如果您执行项目分配(x[...] = ...)或属性分配(x.whatever = ...),则该变量为非局部变量。如果变量是本地的,那意味着它是在函数中创建的(或者是一个输入参数)。您可以直接重新分配到本地标识符,这没有问题。如果变量是非本地变量,那么可以对它进行变异,但不能重新赋值,因为python无法确定变量是本地变量还是非本地变量。

+0

好。你能向我展示解释这个的官方手册/定义吗? – alinsoar

+0

@alinsoar突变是当你改变'in place'时,这正是你在做的事情。如果你在**函数中定义了**,没有返回它,然后在该函数外引用它**,那么你需要一个'global'语句。 –

+0

@mgilson。我知道什么是全球性的。但是,我看不出有关可变变量会发生什么的直接定义。 – alinsoar

0

我认为这是因为sample_array没有在函数内部声明,而只是写入。 Python无法在副函数名称空间中找到sample_array,它会查找外部名称空间。 例如

a = [] 

def test1(): 
    a.append(1) # will use the outer one 

def test2(): 
    a = [] 
    a.append(1) # will use the inner one 

全球,有时,对于声明一个全局变量:

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' 
+0

我认为我的问题有点不同;)它是关于可变变量,它们被视为与正常变量不同。 – alinsoar

+0

对不起,我没有得到poing> _ < – MorningBAI

+0

应该是'a.append(1)' - 括号,而不是'[]' – mgilson