Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        6年前关闭。
                                                                                            
                
        
我在程序主函数中定义并使用一个二维numpy数组。然后在main中调用的函数尝试修改numpy数组而没有成功。数组在第二个函数中声明为全局数组,但仍然出现以下错误:

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

我认为您可以在不调用全局函数的情况下从main读取变量,但是如果您在函数内对其进行了修改,则必须在函数中全局声明它。那是我以为我在这里所做的,但似乎不起作用。只是声明使用numpy,所以也许这是numpy数组特有的?赞赏任何想法。

拉里

最佳答案

我在程序主函数中定义并使用一个二维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中可能会引起误解。)

09-04 22:04
查看更多