有一些方法可以输出两个变量,例如:
def some_method():
#some calculations
return first_value, second_value
现在我想将一行结果放入变量和列表中(将first_value
放入某个变量,将second_value
添加到列表作为新元素。)
我知道我可以这样做:
def some_method(list):
#some calculations
return first_value, list+[second_value]
然后:
some_variable, list = some_method(list)
但是有没有机会在一行中没有传递列表作为方法参数?
答案 0 :(得分:1)
如果你真的想要它,你可以将列表子类化并制作如下:
>>> def f():
... return 1, 2
>>> class MyList(list):
... def __setattr__(self, name, value):
... if name == '_assign_append':
... self.append(value)
...
>>> l = MyList()
>>> a, l._assign_append = f()
>>> a
1
>>> l
[2]
>>> b, l._assign_append = f()
>>> a
1
>>> b
1
>>> l
[2, 2]
答案 1 :(得分:1)
你能否在列表中返回第二个值?
像这样:
>>> L = [1, 2, 3]
>>> def bar():
... return 'shenanigan', [4]
...
>>> myVar, L[len(L):] = bar()
>>> L
[1, 2, 3, 4]
但是,你可以将第二个返回值分配给一个中间变量,然后使用list.append(),使用两行。
答案 2 :(得分:1)
使用函数装饰器,如下所示:
def remember_history(f):
l = []
def wrapper(*args,**kw):
x,e = f(*args,**kw)
l.append(e)
return x,l
return wrapper
def some_method():
return 1,2
f = remember_history(some_method)
print f() # 1,[2]
print f() # 1,[2,2]
print f() # 1,[2,2,2]
答案 3 :(得分:0)
不是没有两次调用该函数:
>>> L = []
>>> def foo():
... return 1, 2
...
>>> myvar, L = foo()[0], L+[foo()[1]]
>>> myvar
1
>>> L
[2]
答案 4 :(得分:0)
>>> L = []
>>> def foo():
... return 1, 2
...
>>> myvar, _ = tuple(process(i) for process, i in zip((lambda x: x, lambda x: L.append(x)), foo()))
>>> myvar
1
>>> L
[2]
这满足了它应该是单行的要求,但对我来说似乎很难看。
我更喜欢使用装饰器。