为空列表放置变量如何改变此 python 代码?
How does putting the variable for empty list alter this python code?
我正在尝试编写代码以使用递归展平任何嵌套列表。这是我写的第一个代码:
def flatten(NL):
a = []
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
flatten(i)
return a
但是,它一直返回一个空列表,直到我更改代码并将变量 "a" 放在函数之外:
a = []
def flatten(NL):
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
flatten(i)
return a
我试图围绕它思考但无济于事。将空列表放在函数之外有何影响?
当你把 a
放在函数外面时,你总是在修改同一个 a
,但是当你把它放在里面时,你每次都在重新定义 a
。由于您只是说 flatten(i)
,而您实际上并未对扁平化版本执行任何操作,因此 a
不受扁平化的影响。您需要将扁平化版本添加到 a
:
def flatten(NL):
a = []
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
a += flatten(i) # Here we add the flattened version to a instead of just creating it.
return a
如果您打算使用递归,那么您还需要 "double dipping" 一个 for 循环。
对于列表的递归操作,在头部进行操作,在尾部进行递归。根本不需要声明自己的列表,这只会增加难度。
def flatten(NL):
if type(NL) == list:
if not NL:
return NL #empty list terminate recursion
return flatten(NL[0]) + flatten(NL[1:])
return [NL] #'scalar' value terminate recursion
这是一个例子
>>> flatten([[1,2],[3,[4,5]],[6,7]])
[1, 2, 3, 4, 5, 6, 7]
我正在尝试编写代码以使用递归展平任何嵌套列表。这是我写的第一个代码:
def flatten(NL):
a = []
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
flatten(i)
return a
但是,它一直返回一个空列表,直到我更改代码并将变量 "a" 放在函数之外:
a = []
def flatten(NL):
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
flatten(i)
return a
我试图围绕它思考但无济于事。将空列表放在函数之外有何影响?
当你把 a
放在函数外面时,你总是在修改同一个 a
,但是当你把它放在里面时,你每次都在重新定义 a
。由于您只是说 flatten(i)
,而您实际上并未对扁平化版本执行任何操作,因此 a
不受扁平化的影响。您需要将扁平化版本添加到 a
:
def flatten(NL):
a = []
for i in NL:
if type(i) == int:
a.append(i)
elif type(i) == list:
a += flatten(i) # Here we add the flattened version to a instead of just creating it.
return a
如果您打算使用递归,那么您还需要 "double dipping" 一个 for 循环。
对于列表的递归操作,在头部进行操作,在尾部进行递归。根本不需要声明自己的列表,这只会增加难度。
def flatten(NL):
if type(NL) == list:
if not NL:
return NL #empty list terminate recursion
return flatten(NL[0]) + flatten(NL[1:])
return [NL] #'scalar' value terminate recursion
这是一个例子
>>> flatten([[1,2],[3,[4,5]],[6,7]])
[1, 2, 3, 4, 5, 6, 7]