我在程序main函数中定义并使用了2维numpy数组。在main中调用的函数然后尝试修改numpy数组但没有成功。该数组在第二个函数中声明为全局,但我仍然收到以下错误:
NameError:未定义全局名称'name_of_the_array'。
我认为你可以在函数中从main中读取一个变量而不调用它是全局的,但是如果你在函数中修改它,你必须在函数中声明它是全局的。这就是我以为我在这里所做的,但它似乎没有用。只是声明使用numpy所以也许这是numpy数组独有的东西?欣赏任何想法。
拉里
答案 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]]