2014-03-29 78 views
-1

Python(我使用2.7)中有一些东西在困扰着我(ha!)。这是我得到NameError: global name 'x' is not defined当我运行这段代码:Python:在函数之间使用变量

def function1(): 
    x = 1 
    return 0 

def function2(): 
    function1() 
    print(x) 
    return 0 

function2() 

这不是对我来说是严重的问题,但我真的很好奇,为什么这不能打印1.这是有道理的,右在我心中流。定义变量x的函数在调用之前被定义,并且该函数在print(x)之前被调用。我真的没有看到为什么这个代码不起作用。也许我想这个的方式是有缺陷的。无论哪种方式,为什么不打印1?先谢谢您的帮助!

+1

词法范围界定:http://en.wikipedia.org/wiki/Scope_(computer_science)#Lexical_scoping_vs._dynamic_scoping – uselpa

+0

我改变了标题,因为我意识到有点太迟了,这很容易让人误解。抱歉!并感谢所有伟大的答案。 – Mikeureko

回答

3

是,你的想法是有缺陷的。在function1中定义的变量x对于该函数是本地的。它在其他地方不存在。当你用另一个函数调用一个函数时,这并不意味着被调用函数的所有变量都会被转储到调用函数中。只有返回值被传回。如果你想在第二个函数中使用x,你应该从function1返回它。 (即使这样,它不会创建一个名为xfunction2变量,它只会返回,而如果你愿意,你就可以分配给一个变量在function2,或打印出来,或什么的。)

+0

也许你应该补充说,你必须在function2()里打印function1()。 – Dehli

+0

在问这个问题之前,我真的不知道有多少变量作用域。我认为它们可以被程序的所有部分使用,即使它们是在函数内部定义的。不管怎样,谢谢! – Mikeureko

+0

Python名称空间的分层方法对于能够编写好的代码非常关键,并且在测试完成后信任它。 –

0

这两个函数都使用global x作为第一行。这将使你的代码工作。但是,无论如何,在函数间传递变量并不是一个好习惯。返回值和使用参数是一个好习惯。

如果您正在测试变量共享,您正在使用全局变量。为此,与javascript不同,在尝试获取它之前,您需要使用global x,就像在php中一样(除非使用严格模式,否则不会在php中出错)。

+2

的确,这可以解决问题,但是全局变量通常不好用,应该避免。 – Dehli

+0

是的,我补充说。 –

0

x范围仅function1()这就是为什么你不能打印xfunction2(),即使你打电话function1()(当您从function1()返回,x将被销毁

0

由于function1范围内的变量x是本地的,并且function2没有“看见”这个变量。