在main中定义的Numpy数组在函数中无法识别

时间:2013-09-16 00:38:02

标签: python arrays numpy global

我在程序main函数中定义并使用了2维numpy数组。在main中调用的函数然后尝试修改numpy数组但没有成功。该数组在第二个函数中声明为全局,但我仍然收到以下错误:

NameError:未定义全局名称'name_of_the_array'。

我认为你可以在函数中从main中读取一个变量而不调用它是全局的,但是如果你在函数中修改它,你必须在函数中声明它是全局的。这就是我以为我在这里所做的,但它似乎没有用。只是声明使用numpy所以也许这是numpy数组独有的东西?欣赏任何想法。

拉​​里

2 个答案:

答案 0 :(得分:1)

  

我在程序main函数中定义并使用了2维numpy数组。在main中调用的函数然后尝试修改numpy数组但没有成功。该数组在第二个函数中声明为全局,但我仍然收到以下错误:

您必须在函数中将其声明为global。否则,您只是创建一个局部变量,而不是全局变量。而且无论是否有global,您都无法访问其他函数的局部变量;你只能访问全局变量。

  

我认为你可以在函数中从main中读取一个变量,而不是将其称为全局变量,但是如果你在函数中修改它,你必须在函数中声明它是全局的。

足够接近真实......但创建它就算是修改它。


所以,而不是:

def sub():
    global name_of_array
    return name_of_array[0, 0]

def main():
    name_of_array = np.zeros((2, 2))
    sub()

......这样做:

def sub():
    global name_of_array
    return name_of_array[0, 0]

def main():
    global name_of_array
    name_of_array = np.zeros((2, 2))
    sub()

然而,有一个更好的解决方案:只需将数组作为参数传递,而不是使用全局:

def sub(name_of_array):
    return name_of_array[0, 0]

def main():
    name_of_array = np.zeros((2, 2))
    sub(name_of_array)

如果你避免这种情况,因为你是来自像C ++这样的语言,并且担心这会浪费大量的时间和内存来复制整个数组,那么Python就不会这样。 (在C ++术语中,所有变量都被传递,就像使用引用参数一样......虽然这个术语在Python中可能会产生误导。)

答案 1 :(得分:0)

不是答案,更多是评论,但我想展示我的代码。我测试了我认为是你的场景,它对我有用。也许你可以将你的代码与我的代码进行比较并解释有什么不同?

#! /usr/bin/env python
import numpy as np

def arr_mod():
    print 'reshaping a'
    a.shape = (2,-1)

if __name__=='__main__':
    a = np.arange(10)
    print 'a initialized as'
    print a
    arr_mod()
    print 'a is now'
    print a

运行方式:

askewchan:~$ ./test.py
a initialized as
[0 1 2 3 4 5 6 7 8 9]
    ... reshaping a
a is now
[[0 1 2 3 4]
 [5 6 7 8 9]]