我试图在另一个函数中定义的函数中使用变量/列表而不使其成为全局函数。
这是我的代码:
def hi():
hello = [1,2,3]
print("hello")
def bye(hello):
print(hello)
hi()
bye(hello)
目前我收到错误"你好" in" bye(你好)"没有定义。
我该如何解决这个问题?
答案 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)