我尝试了下面的代码:
def split(arr,i=0):
if i==0:
print("hey")
splitted=[]
print('splitted initialized')
a1=arr[:len(arr)//2]
a2=arr[len(arr)//2:]
if len(a1)>2:
print("splitting "+str(a1))
i+=1
split(a1,i)
else:
print("not splitting "+str(a1))
splitted.append(a1)
if len(a2)>2:
print("splitting "+str(a2))
i+=1
split(a2,i)
else:
print("not splitting "+str(a2))
splitted.append(a2)
return(splitted)
执行时出现以下错误:
分割([1,2,3,4,6,7,8,54,76,3,4,5,67,78,8,7,45,2]) 我希望空列表“分割”在第 0 次初始化期间仅初始化一次
hey
splitted initialized
splitting [1, 2, 3, 4, 6, 7, 8, 54, 76]
splitting [1, 2, 3, 4]
not splitting [1, 2]
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
split([1,2,3,4,6,7,8,54,76,3,4,5,67,78,8,7,45,2])
File "\Documents\python_projects-20170821\python_projects\sorting_algorithms\merge_sort\merge_sort.py", line 15, in split
split(a1,i)
File "\Documents\python_projects-20170821\python_projects\sorting_algorithms\merge_sort\merge_sort.py", line 15, in split
split(a1,i)
File "\Documents\python_projects-20170821\python_projects\sorting_algorithms\merge_sort\merge_sort.py", line 18, in split
splitted.append(a1)
UnboundLocalError: local variable 'splitted' referenced before assignment
我可以通过将 this 函数嵌套在另一个函数中来克服这个问题,如下所示:
下面的代码在调用时工作正常: 分割器([1,2,3,4,6,7,8,54,76,3,4,5,67,78,8,7,45,2])
def splitter(arr):
splitted=[]
def split(arr):
a1=arr[:len(arr)//2]
a2=arr[len(arr)//2:]
if len(a1)>2:
print("splitting "+str(a1))
split(a1)
else:
print("not splitting "+str(a1))
splitted.append(a1)
if len(a2)>2:
print("splitting "+str(a2))
split(a2)
else:
print("not splitting "+str(a2))
splitted.append(a2)
return(splitted)
return split(arr)
我只是想了解为什么我的第一个版本的代码不起作用?
最佳答案
这个版本的split
可能有效(但我更喜欢你的嵌套函数)
def split(arr, splitted=None):
if splitted == None:
print("hey")
splitted = []
print('splitted initialized')
a1=arr[:len(arr)//2]
a2=arr[len(arr)//2:]
if len(a1)>2:
print("splitting "+str(a1))
split(a1, splitted)
# the reset elided
注意splitted
是如何沿着递归链传递的。
关于python - 只需在第一次调用时在递归函数中初始化一次空列表。如果对深度变量的调节不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48543779/