我的问题是函数是否可以使用list方法扩展?我正在尝试理解的函数示例:
def g(p):
w = p.pop(1)
p.extend(w)
return p
y = ['k', 'l', 'm']
g(y[:]).extend(g(y))
返回y的以下值:
['k', 'm', 'l']
但是我期待y的以下值:
['k', 'm', 'l', 'k', 'm', 'l']
有人能够向我解释这里发生了什么吗?是不允许将函数用作参数,还是不允许它们使用list方法扩展?
答案 0 :(得分:1)
按预期工作:
发生了什么,是:
1-首先,y未发生变异,因为您将其深层副本传递给g
。
直接传递给g
的第二次调用时,2- g会发生变异
3-您没有从g(y)中分配返回的结果
4- extend返回无
def g(p):
w = p.pop(1)
p.extend(w)
return p
y = ['k', 'l', 'm']
res = g(y[:]) # <- this does not mutate y
res.extend(g(y)) # <- this does mutate y
y, res
result from the first call to g
|------------|
(['k', 'm', 'l'], ['k', 'm', 'l', 'k', 'm', 'l'])
|------------| |------------|
y mutated at 2nd call extended with mutated y from 2nd call