全局数组 - 不需要“全局”语句

时间:2013-10-10 08:04:34

标签: python numpy

我写了这段代码:

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

但是,令我惊讶的是,它没有“全球化”,效果很好。 为什么会起作用?在这种情况下评估的定义是什么?

2 个答案:

答案 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'