关于python变量范围的一个小问题

时间:2008-12-10 22:20:07

标签: python variables scope

我是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

5 个答案:

答案 0 :(得分:5)

函数hellohi的范围完全不同。他们没有任何共同的变数。

请注意,调用hi(x,y)的结果是某个对象。您可以在函数good中使用名称hello保存该对象。

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

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


编辑。后续行动:“那么如果我想在hi函数中使用hello函数的结果,该怎么办?”

没什么不寻常的。仔细查看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. 创建了一个新的命名空间
  3. hello中,x绑定到对象2。绑定是按位置顺序完成的。

  4. hello中,y绑定到对象3

  5. hello中,Python评估第一个语句,fordf150 = hi( y, x )y为3,x为2。

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

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

    ℃。在hi中,iy绑定到对象2

    d。在hi中,会发生某些事情并且good绑定到某个对象,例如3.1415926

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

    F。 hi命名空间将被丢弃。 goodixiy消失了。但是,对象(3.1415926)仍然是评估hi的值。

  6. hello中,Python完成第一个语句,fordf150 = hi( y, x )y为3,x为2. hi的值为3.1415926

    一个。 fordf150绑定到通过评估hi3.1415926创建的对象。

  7. hello中,Python转到其他语句。

  8. 某些时候something被绑定到一个对象,比如2.718281828459045

  9. hello中,执行return;将对象标识为hello的值。在这种情况下,对象由something命名,并且是对象2.718281828459045

  10. 命名空间被丢弃。与fordf150something一样,xy消失了。但是,对象(2.718281828459045)仍然是评估hello的值。

  11. 任何名为hello的程序或脚本都可以得到答案。

答案 1 :(得分:3)

如果要从函数内部向全局命名空间定义变量,从而使其可以被此空间中的其他函数访问,则可以使用global关键字。这是一些例子

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

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

全球这个词并不完全是全球性的,因为它最初可能看起来像。它实际上只是指向您正在使用的文件中最低命名空间的链接。无法在另一个模块中访问全局关键字。

作为一个温和的警告,一些人可能认为这不是“好习惯”。

答案 2 :(得分:2)

你的示例程序是有效的,因为'good'的两个实例是不同的变量(你碰巧两个变量都具有相同的名称)。以下代码完全相同:

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

答案 3 :(得分:2)

有关python范围规则的更多详细信息,请访问:

Short Description of Python Scoping Rules

答案 4 :(得分:1)

“hello”函数不介意你调用尚未定义的“hi”函数,前提是你没有尝试实际使用“hello”函数,直到定义了这两个函数之后