python - 只需在第一次调用时在递归函数中初始化一次空列表。如果对深度变量的调节不起作用

标签 python recursion flags depth

我尝试了下面的代码:

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/

相关文章:

python - 使用 Python Selenium,如何点击 webElements 的 webElement?

Python float 舍入错误 117.285 舍入到 117.28 而不是 117.29

javascript - 递归地交换数组中的对

c - 网络编程/消息框架

python - 如何使用 SqlAlchemy 顺序获取列中的所有值?

python - 合并两个字典列表,忽略 None 条目

使用2个队列的Java堆栈

Linq 查询递归

math - DAA指令中的半进位/半借位标志

sockets - MSG_WAITALL与SO_RCVTIMEO结合使用?