所以 a 有兩個進行遞回呼叫的函式,第一個呼叫修改串列 l1,然后傳遞給第二個呼叫。在 f1 第二次遞回呼叫接收到修改后的串列 [1,1]:
b 2 []
b 1 []
a 1 [1, 1]
b 1 [1, 1]
a 1 [1, 1, 1, 1]
a 2 [1, 1, 1, 1, 1, 1]
但在 f2 第二次呼叫中收到未修改的空串列:
b 2 []
b 1 []
a 1 [1, 1]
b 1 []
a 1 [1, 1]
a 2 [1, 1, 1, 1]
為什么?f2(f1) 不是在這兩種情況下都被連續呼叫了嗎?
def f1(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
l1 = [*l1, *f1(l1, num-1)]
l1 = [*l1, *f1(l1, num -1)]
print('a',num,l1)
return l1
def f2(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
l1 = [*l1, *f2(l1, num-1),*f2(l1, num -1)]
print('a',num,l1)
return l1
如果串列理解是一個問題(你不能在其中修改串列),為什么在這里修改它:
def f3(l1):
print(l1)
l1 =[1]
return l1
l1 = []
l1 = [*l1, *f3(l1), *f3(l1)]
print(l1)
[]
[1]
[1, 1, 1]
uj5u.com熱心網友回復:
該函式f1創建一個全新的串列,然后在對 的第二次呼叫中使用該新串列f1。該函式f2只將原始串列傳遞給它對 的呼叫f2。
要展開,在 中f1,邏輯如下所示:
def f1(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
# Here, *f1(l1, num-1) uses the original value of
# l1, then expands it.
# *l1 expands the original value of l1.
# The [...] creates a completely new list,
# and finally, l1 = ... assigns that completely new
# list to the value of l1.
l1 = [*l1, *f1(l1, num-1)]
# Here, the l1 in *f1(l1, num -1) refers to the
# result of the assignment above, l1 = ...
#
# *l1 also refers to the result of the assignment
# above.
#
# Again, [...] creates a completely new list,
# then l1 = ... assigns that new list to the name l1.
l1 = [*l1, *f1(l1, num -1)]
print('a',num,l1)
return l1
# This function is identical
def f1(first_list = [], num = 2):
if num == 0: return [1]
print('b', num, first_list)
second_list = [*first_list, *f1(first_list, num - 1)]
third_list = [*second_list, *f1(second_list, num - 1)]
print('a', num, third_list)
return third_list
在 中f2,邏輯如下所示:
def f2(l1=[],num = 2):
if num == 0: return[1]
print('b',num,l1)
# Here, both *f2(l1, num-1) calls refer to the original l1
# passed in the argument list.
#
# *l1 refers to the original l1 passed in the argument list,
# too.
#
# The [...] creates a whole new list,
# then l1 = ... assigns that new list to the name l1.
l1 = [*l1, *f2(l1, num-1),*f2(l1, num -1)]
print('a',num,l1)
return l1
# This function is identical
def f2(first_list = [], num = 2):
if num == 0: return [1]
print('b', num, first_list)
second_list = [*first_list, *f2(first_list, n - 1), *f2(first_list, n - 1)]
print('a', num, second_list)
return second_list
f2和之間的區別在于f3,在 中f2,您沒有呼叫任何修改串列的代碼:您正在創建一個全新的串列,然后重新分配名稱l1以參考新串列。在 中f3,您不是在創建一個全新的串列,您只是在原地修改串列。
讓我們舉一個簡單的例子來證明這一點:
>>> def set_value(first_list):
... first_list = [ 2 ]
...
>>> mylist = [3, 4]
>>> set_value(mylist)
>>> mylist
[3, 4]
>>>
>>> def set_value(first_list):
... first_list.clear()
... first_list.append(2)
...
>>> mylist
[3, 4]
>>> set_value(mylist)
>>> mylist
[2]
>>>
該 =運營商修改左側串列中,而=不會修改在所有的串列。l1 = ...添加...到串列l1參考的末尾。l1 = ...只需更改名稱l1所指的內容:您可以使其指代整數、字典、物件或其他任何內容。
uj5u.com熱心網友回復:
在 中f1,第二個呼叫接收 的修改內容,l1但在f2它接收原始(未修改)內容,因為在執行理解時串列沒有修改,但只有在結果串列構建完成后才在最后。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/351066.html
上一篇:后續行動:將data.frame中缺失的列放回dta.frames串列中
下一篇:從串列創建圖表
