2008-12-10 64 views
1

我是python的初学者,有一个问题,对我来说很困惑。 如果我首先定义一个函数,但是在函数中我必须使用一个在下面的另一个函数中定义的变量,我可以这样做吗?或者,如何将另一个函数的返回值导入到函数中? 例如:关于python的变量范围的一个小问题

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return good 
+0

你的问题并不完全清晰。这两种方法如何相关?他们属于同一个班级吗? – 2008-12-10 22:23:25

+0

是的,他们在同一个班级中,只是第一个功能需要第二个功能来做某件事情的结果。 – NONEenglisher 2008-12-10 22:28:13

回答

5

的功能hello范围和hi是完全不同的。他们没有任何共同的变数。

请注意,调用hi(x,y)的结果是一些对象。用功能hello中的名称good保存该对象。

hello中名为good的变量是一个不同的变量,与函数hi中名为good的变量无关。

它们拼写相同,但存在于不同的命名空间中。为了证明这一点,改变两个函数之一的good变量的拼写,你会发现事情仍然有效。


编辑。跟进:“所以如果我想用hello函数中的hi函数的结果怎么办?”

没什么不寻常的。密切关注hello

def hello(x,y): 
    fordf150 = hi(y,x) 
    "then do somethings,and use the variable 'fordf150'." 
    return something 

def hi(ix, iy): 
    "compute some value, good." 
    return good 

一些脚本评估hello(2, 3)

  1. Python为hello的评估创建了一个新的命名空间。

  2. hello,x绑定到对象2。绑定是按位置顺序完成的。

  3. hello,y绑定到对象3

  4. hello,Python中评估第一语句,fordf150 = hi(y, x)y是3,x是2

    一个。 Python为hi的评估创建一个新的名称空间。

    b。在hi中,ix绑定到对象3。绑定是按位置顺序完成的。

    c。在hi中,iy绑定到对象2。d)。在hi中,发生了一些事情,并且good被绑定到某个对象,例如3.1415926

    e。在hi中,执行return;将对象标识为hi的值。在这种情况下,该对象由good命名,并且是对象3.1415926

    f。放弃hi命名空间。 good,ixiy消失。但是,对象(3.1415926)仍然是评估hi的值。

  5. hello,Python中完成的第一条语句,fordf150 = hi(y, x)y是3,x是2的hi值是3.1415926

    a。 fordf150绑定到通过评估hi,3.1415926创建的对象。

  6. hello中,Python转入其他语句。

  7. 在某个点something被绑定到一个对象,比如2.718281828459045

  8. hello中,执行return;将一个对象标识为hello的值。在这种情况下,该对象的名称是something,并且是对象2.718281828459045

  9. 命名空间被丢弃。 fordf150something消失,如xy。然而,对象(2.718281828459045)仍然是评估hello的值。

无论程序或脚本hello都能得到答案。

2

您的示例程序的工作,因为“好”的两个实例是不同的变量(你恰好有两个变量具有相同的名称)。以下代码是完全一样的:

def hello(x,y): 
    good=hi(iy,ix) 
    "then do somethings,and use the parameter'good'." 
    return something 

def hi(iy,ix): 
    "code" 
    return great 
1

“hello”函数并不介意调用尚未定义的“hi”函数,只要在两个函数都没有尝试实际使用“hello”函数定义。

3

如果要从函数内部为全局名称空间定义一个变量,从而使其可以通过此空间中的其他函数访问,则可以使用全局关键字。下面是一些示例

varA = 5 #A normal declaration of an integer in the main "global" namespace 

def funcA(): 
    print varA #This works, because the variable was defined in the global namespace 
       #and functions have read access to this. 
def changeA(): 
    varA = 2 #This however, defines a variable in the function's own namespace 
       #Because of this, it's not accessible by other functions. 
       #It has also replaced the global variable, though only inside this function 
def newVar(): 
    global varB #By using the global keyword, you assign this variable to the global namespace 
    varB = 5 

def funcB(): 
    print varB #Making it accessible to other functions 

结论:在函数中定义的变量保留在函数的名称空间中。它仍然可以访问全局名称空间以进行只读操作,除非该变量已用全局关键字调用。

全球一词并不完全是全球性的,因为它起初看起来似乎是全球性的。它实际上只是您工作文件中最低命名空间的链接。全局关键字不能在另一个模块中访问。

作为一个温和的警告,这可能被认为是一些较少的“良好做法”。