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

时间:2015-10-28 11:35:59

标签: python function variables global local

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

这是我的代码:

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

def bye(hello):
    print(hello)

hi()
bye(hello)

目前我收到错误"你好" in" bye(你好)"没有定义。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

您需要使用hi方法返回问候语。

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

有关Python中变量范围的信息:

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

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

因此,在hi中,您将返回:

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

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

hi_result = hi()

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

bye(hi_result)

答案 1 :(得分:3)

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

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

def bye(hello):
    print(hello)

hi()

答案 2 :(得分:2)

如果没有public final class SingleTests { @Test public void collect_single() { ArrayList<String> list = new ArrayList<>(); list.add("ABC"); String collect = list.stream().collect(new SingleCollector<>()); assertEquals("ABC", collect); } @Test(expected = SingleException.class) public void collect_multiple_entries() { ArrayList<String> list = new ArrayList<>(); list.add("ABC"); list.add("ABCD"); list.stream().collect(new SingleCollector<>()); } @Test(expected = SingleException.class) public void collect_no_entries() { ArrayList<String> list = new ArrayList<>(); list.stream().collect(new SingleCollector<>()); } @Test public void collect_single_or_null() { ArrayList<String> list = new ArrayList<>(); list.add("ABC"); String collect = list.stream().collect(new SingleOrNullCollector<>()); assertEquals("ABC", collect); } @Test(expected = SingleException.class) public void collect_multiple_entries_or_null() { ArrayList<String> list = new ArrayList<>(); list.add("ABC"); list.add("ABCD"); list.stream().collect(new SingleOrNullCollector<>()); } @Test public void collect_no_entries_or_null() { ArrayList<String> list = new ArrayList<>(); assertNull(list.stream().collect(new SingleOrNullCollector<>())); } } ,你不能在函数内声明全局变量。你可以这样做

global

答案 3 :(得分:0)

正如其他人所说的那样,听起来你正在尝试以不同的方式解决一些更好的事情(参见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函数本身上打招呼:

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)