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

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

4

2 回答 2

1

global如果您要更改对对象的引用(例如,使用赋值),则必须这样做。如果您只是改变对象(例如,像上面所做的那样使用切片分配) ,则没有必要。

确切的文档在这里

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

因此,使用 global 语句,您是在告诉 python 变量存在于全局上下文中。如果您分配给它,那么您将更改全局上下文中的值。

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

于 2013-10-10T08:05:59.873 回答
1

我认为这是因为 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'
于 2013-10-10T08:16:02.517 回答