我试图理解一个关于在python中传递变量和作用域的基本概念,但我显然遗漏了一些东西,因为我花了很多时间阅读但没有得到我期待的东西。
我希望以下内容为:
在main()
在define_stuff()中,添加1并指定给b,将b或3传递回main()。
在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()的
我使用的是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
答案 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
的结果,如上所示。