1

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

NameError:未定义全局名称“name_of_the_array”。

我认为您可以在函数中从 main 读取变量而无需将其称为全局变量,但是如果您在函数中对其进行了修改,则必须在函数中将其声明为全局变量。这就是我认为我在这里所做的,但它似乎不起作用。只是说要使用 numpy 所以也许它是 numpy 数组独有的东西?欣赏任何想法。

拉里

4

2 回答 2

2

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

您必须将其声明为globalmain函数中。否则,您只是在创建一个局部变量,而不是一个全局变量。而且你不能访问另一个函数的局部变量,不管有没有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 中可能会产生误导。)

于 2013-09-16T03:52:59.460 回答
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]]
于 2013-09-16T02:09:00.493 回答