Python在(子)函数中传递变量

时间:2017-05-17 20:37:43

标签: python function arguments

我试图理解一个关于在python中传递变量和作用域的基本概念,但我显然遗漏了一些东西,因为我花了很多时间阅读但没有得到我期待的东西。

我希望以下内容为:

  1. 在main()

  2. 中定义全局a
  3. 在define_stuff()中,添加1并指定给b,将b或3传递回main()。

  4. 在add_stuff()中,添加a到b并指定c,将c或5传递回main()。

    def main():     a ='2'

    def define_stuff():
        b = 1 + float(a)
        print 'returning', b
        return b
    
    def add_stuff():
        print 'adding b to a ', 
        c = float(a) + float(b)
        print 'getting', c
        return c 
    
    define_stuff()
    add_stuff()
    

    如果名称 =='主要':      main()的

  5. 我使用的是2.7。显然,“回归”并没有达到我的预期。

    我需要做什么才能将(sub)函数中的局部变量传递给main()?

    returning 3.0
    adding b to a
    Traceback (most recent call last):
      File "C:\scripts\testscope.py", line 19, in <module>
        main()
      File "C:\scripts\testscope.py", line 16, in main
        add_stuff()
      File "C:\scripts\testscope.py", line 11, in add_stuff
        c = float(a) + float(b)
    NameError: global name 'b' is not defined
    

2 个答案:

答案 0 :(得分:3)

首先,a不是&#34;全球&#34;在main中,它是本地main 。无论如何,当你return来自某个函数的局部变量时,它不会影响周围范围内的任何内容,除非你在该范围内分配返回值

In [1]: def main():
   ...:     a = '2'
   ...:
   ...:     def define_stuff():
   ...:         b = 1 + float(a)
   ...:         print 'returning', b
   ...:         return b
   ...:
   ...:     def add_stuff():
   ...:         print 'adding b to a ',
   ...:         c = float(a) + float(b)
   ...:         print 'getting', c
   ...:         return c
   ...:
   ...:     b = define_stuff() # or else the value get's discarded
   ...:     c = add_stuff() # or else the value gets discarded
   ...:

In [2]: main()

returning 3.0
adding b to a  getting 5.0

注意,这是编写代码的一种脆弱方式,因为您的add_stuff函数取决于某些非本地b,因此如果您想使用add_stuff,那么必须确保在变量分辨率顺序的某处b(本地,封闭...全局)。相反,更好的做法是仅处理来自函数的局部变量return值,并将值作为参数传递给函数,如果函数将使用它们。仅谨慎使用global个变量。所以,这会更好:

In [5]: def main():
   ...:
   ...:     def define_stuff(a):
   ...:         b = 1 + float(a)
   ...:         print 'returning', b
   ...:         return b
   ...:
   ...:     def add_stuff(a, b):
   ...:         print 'adding b to a ',
   ...:         c = float(a) + float(b)
   ...:         print 'getting', c
   ...:         return c
   ...:
   ...:     x = '2'
   ...:     y = define_stuff(x) # or else the value get's discarded
   ...:     z = add_stuff(x, y) # or else the value gets discarded
   ...:

In [6]: main()
returning 3.0
adding b to a  getting 5.0

注意,我使用x, y, z只是为了强调这些是独立的局部变量,但您可以使用a,b,c,但请记住,他们没有内部函数范围中a, b, c的内在连接。

答案 1 :(得分:2)

return b返回b的值,但需要将其存储在main中的变量中。变量b现在是您的函数add_stuff的本地变量。您需要的是b中的变量main来捕获您返回的值:

def main():
    a = '2'

    def define_stuff():
        b = 1 + float(a)
        print 'returning', b
        return b

    def add_stuff():
        print 'adding b to a ', 
        c = float(a) + float(b)
        print 'getting', c
        return c 

    b = define_stuff()
    c = add_stuff()

if __name__ == '__main__':
     main()

此外,您可能还希望在add_stuff中抓住c的结果,如上所示。