在不使用全局的情况下调用不同函数中的变量
Calling a variable in a different function without using global
我正在尝试在另一个函数中定义的函数中使用变量/列表,而不是将其设为全局变量。
这是我的代码:
def hi():
hello = [1,2,3]
print("hello")
def bye(hello):
print(hello)
hi()
bye(hello)
目前我收到 "bye(hello)" 中的 "hello" 未定义的错误。
我该如何解决?
如果您不想使用全局变量,最好的选择就是从 hi()
.
中调用 bye(hello)
def hi():
hello = [1,2,3]
print("hello")
bye(hello)
def bye(hello):
print(hello)
hi()
您需要 return 从您的 hi
方法问好。
通过简单地打印,您无法访问 hi
方法内部发生的事情。在方法内部创建的变量保留在该方法的范围内。
Python中变量作用域的信息:
http://gettingstartedwithpython.blogspot.ca/2012/05/variable-scope.html
你 return hello
在你的 hi
方法中,然后,当你调用 hi
时,你应该将结果存储在一个变量中。
所以,在 hi
,你 return:
def hi():
hello = [1,2,3]
return hello
然后当你调用你的方法时,你将 hi
的结果存储在一个变量中:
hi_result = hi()
然后,将该变量传递给 bye
方法:
bye(hi_result)
你不能在没有global
的情况下在函数内声明全局变量。你可以这样做
def hi():
hello = [1,2,3]
print("hello")
return hello
def bye(hello):
print(hello)
hi()
bye(hi())
正如其他人所说,听起来您正在尝试解决一些以不同方式解决的问题(请参阅 XY problem
)
如果 hi 和 bye 需要共享不同类型的数据,您最好使用 class。例如:
class MyGreetings(object):
hello = [1, 2, 3]
def hi(self):
print('hello')
def bye(self):
print(self.hello)
你也可以用全局变量来做:
global hello
def hi():
global hello
hello = [1,2,3]
print("hello")
def bye():
print(hello)
或者通过给 return 一个值:
def hi():
hello = [1,2,3]
print("hello")
return hello
def bye():
hello = hi()
print(hello)
或者你可以让 hi 在 hi 函数本身上打招呼:
def hi():
hello = [1,2,3]
print("hello")
hi.hello = hello
def bye():
hello = hi.hello
print(hello)
话虽如此,完成您所要求的粗略方法是提取 hi() 的源代码,并在 bye() 中执行函数体,然后提取变量 hello :
import inspect
from textwrap import dedent
def hi():
hello = [1,2,3]
print("hello")
def bye():
sourcelines = inspect.getsourcelines(hi)[0]
my_locals = {}
exec(dedent(''.join(sourcelines[1:])), globals(), my_locals)
hello = my_locals['hello']
print(hello)
我正在尝试在另一个函数中定义的函数中使用变量/列表,而不是将其设为全局变量。
这是我的代码:
def hi():
hello = [1,2,3]
print("hello")
def bye(hello):
print(hello)
hi()
bye(hello)
目前我收到 "bye(hello)" 中的 "hello" 未定义的错误。
我该如何解决?
如果您不想使用全局变量,最好的选择就是从 hi()
.
bye(hello)
def hi():
hello = [1,2,3]
print("hello")
bye(hello)
def bye(hello):
print(hello)
hi()
您需要 return 从您的 hi
方法问好。
通过简单地打印,您无法访问 hi
方法内部发生的事情。在方法内部创建的变量保留在该方法的范围内。
Python中变量作用域的信息:
http://gettingstartedwithpython.blogspot.ca/2012/05/variable-scope.html
你 return hello
在你的 hi
方法中,然后,当你调用 hi
时,你应该将结果存储在一个变量中。
所以,在 hi
,你 return:
def hi():
hello = [1,2,3]
return hello
然后当你调用你的方法时,你将 hi
的结果存储在一个变量中:
hi_result = hi()
然后,将该变量传递给 bye
方法:
bye(hi_result)
你不能在没有global
的情况下在函数内声明全局变量。你可以这样做
def hi():
hello = [1,2,3]
print("hello")
return hello
def bye(hello):
print(hello)
hi()
bye(hi())
正如其他人所说,听起来您正在尝试解决一些以不同方式解决的问题(请参阅 XY problem )
如果 hi 和 bye 需要共享不同类型的数据,您最好使用 class。例如:
class MyGreetings(object):
hello = [1, 2, 3]
def hi(self):
print('hello')
def bye(self):
print(self.hello)
你也可以用全局变量来做:
global hello
def hi():
global hello
hello = [1,2,3]
print("hello")
def bye():
print(hello)
或者通过给 return 一个值:
def hi():
hello = [1,2,3]
print("hello")
return hello
def bye():
hello = hi()
print(hello)
或者你可以让 hi 在 hi 函数本身上打招呼:
def hi():
hello = [1,2,3]
print("hello")
hi.hello = hello
def bye():
hello = hi.hello
print(hello)
话虽如此,完成您所要求的粗略方法是提取 hi() 的源代码,并在 bye() 中执行函数体,然后提取变量 hello :
import inspect
from textwrap import dedent
def hi():
hello = [1,2,3]
print("hello")
def bye():
sourcelines = inspect.getsourcelines(hi)[0]
my_locals = {}
exec(dedent(''.join(sourcelines[1:])), globals(), my_locals)
hello = my_locals['hello']
print(hello)