在不使用全局的情况下调用不同函数中的变量

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)