2 回答

TA貢獻(xiàn)1829條經(jīng)驗 獲得超7個贊
Python 旨在通過解包運算符 * 或使用 lambda 使這變得相當(dāng)容易
讓我們來看看吧。
callstack = [] # initialize a list to serve as our stack.
# See also collections.deque for a queue.
然后我們可以定義我們的函數(shù):
def somefunc(a, b, c):
do stuff...
然后將參數(shù)作為列表添加到堆棧中。
args = [a, b, c]
callstack.append((somefunc, args)) # append a tuple with the function
# and its arguments list.
# calls the next item in the callstack
def call_next(callstack):
func, args = callstack.pop() # unpack our tuple
func(*args) # calls the func with the args unpacked
* 運算符將您的列表解包并按順序提供它們作為參數(shù)。您還可以使用雙星運算符 (**) 解壓縮關(guān)鍵字參數(shù)。
def call_next(callstack):
func, args, kwargs = callstack.pop() # unpack our tuple
func(*args, **kwargs) # calls the func with both args and kwargs unpacked.
另一種方法是創(chuàng)建一個 lambda。
def add(a, b):
return a + b
callstack = []
callstack.append(lambda: add(1, 2))
callstack.pop()() # pops the lambda function, then calls the lambda function,
# which just calls the function as you specified it.
瞧!所有功勞都?xì)w功于另一個線程中的作者。這里有一個問題:如果您將對象作為參數(shù)傳遞,它將作為引用傳遞。請小心,因為您可以在堆棧中調(diào)用對象之前對其進(jìn)行修改。
def add(a, b, c):
return a + b + c
badlist = [1,2,3]
callstack.append((somefunc, badlist))
badlist = [2, 4, 6]
callstack.append((somefunc, badlist))
while len(callstack) > 0:
print(call_next(callstack))
# Prints:
12
12
你可以在 *args 版本中解決這個問題:
# make a shallow copy and pass that to the stack instead.
callstack.append((somefunc, list(badlist)))
在 lambda 函數(shù)中,整個事物都在調(diào)用時進(jìn)行評估,因此即使通常不是引用的事物也表現(xiàn)得像引用。上述技巧不起作用,因此在創(chuàng)建 lambda 之前根據(jù)需要進(jìn)行任何復(fù)制。
添加回答
舉報