【问题标题】:Calling a variable in a different function without using global在不使用全局的情况下在不同的函数中调用变量
【发布时间】:2015-10-28 11:35:59
【问题描述】:

我正在尝试在另一个函数中定义的函数中使用变量/列表,而不使其成为全局变量。

这是我的代码:

def hi():
    hello = [1,2,3]
    print("hello")

def bye(hello):
    print(hello)

hi()
bye(hello)

目前我收到“bye(hello)”中的“hello”未定义的错误。

我该如何解决这个问题?

【问题讨论】:

  • 就目前而言,hello 是一个名称(读取变量),是 hi 函数的本地名称。据我所知,最好的方法是在全局空间(即调用函数的位置)中分配 hello 并将此类变量作为参数传递给函数。或者,如下所示,让hi 返回hello
  • 你无法解决这个问题,一个函数的局部变量不能在另一个函数中看到:这都是局部变量的兴趣!
  • 我相信这是XY problem,因为您正在尝试的内容不符合任何好的做法。你想达到什么目的?想要执行这种奇怪的编码的原因是什么?
  • @Pynchia 我上面使用的代码只是一些组合在一起的东西。我真的只是想在一个不同的函数中访问一个函数中定义的列表,而不是让它成为全局的。有点类似于 XY 问题:P
  • 好吧,我想我可以尝试帮助您解决设计难题 :)

标签: python function variables global local


【解决方案1】:

您需要从您的hi 方法返回 hello。

通过简单的打印,您无法访问hi 方法中发生的事情。在方法内创建的变量保留在该方法的范围内。

关于 Python 中变量作用域的信息:

http://gettingstartedwithpython.blogspot.ca/2012/05/variable-scope.html

您在hi 方法中返回hello,然后,当您调用hi 时,您应该将结果存储在一个变量中。

所以,在hi,你返回:

def hi():
    hello = [1,2,3]
    return hello

然后当你调用你的方法时,你将hi 的结果存储在一个变量中:

hi_result = hi()

然后,将该变量传递给 bye 方法:

bye(hi_result)

【讨论】:

  • 谢谢!我试过这样做,但我不记得该怎么做。你的回答肯定有帮助:P
【解决方案2】:

如果您不想使用全局变量,最好的选择就是从hi() 中调用bye(hello)

def hi():
    hello = [1,2,3]
    print("hello")
    bye(hello)

def bye(hello):
    print(hello)

hi()

【讨论】:

  • 谢谢!这对我来说似乎是最好的方法。问题中的代码是我编写的示例代码。我尝试将您的想法实现到我的主代码中,但是对于函数“bye”中的其他变量,我得到了相同的错误(在我的正确代码中没有调用 bye)。我该如何解决这个问题? @QuakeCore
  • 您可以尝试将其他变量作为参数与hello 一起发送,或者更好地发送到use classes
【解决方案3】:

你不能在没有global的函数内声明全局变量。你可以这样做

def hi():
    hello = [1,2,3]
    print("hello")
    return hello

def bye(hello):
    print(hello)

hi()
bye(hi())

【讨论】:

    【解决方案4】:

    正如其他人所说,听起来您正在尝试解决一些最好以不同方式完成的事情(请参阅XY problem )

    如果 hi 和 bye 需要共享不同类型的数据,最好使用类。例如:

    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)
    

    或者让 hi 返回一个值:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多