如何将这个Python可变函数转换为不可变函数?

如何将这个Python可变函数转换为不可变函数?,python,list,immutability,Python,List,Immutability,我有一个可变的Fibonacci函数,它对一个列表进行变异,以便将该列表作为fib序列返回。我想做同样的事情。。。但是列表(在本例中为元组)不应该能够更改。返回仍然必须发送整个列表,我如何实现它,而不使用递归 如果x=6。。。列表应返回{1,1,2,3,5,8} 我正在运行python 3.5 这是我的密码: def mutableFib(x): result = [] for y in range(0,x): if y < 2: result.append(1)

我有一个可变的Fibonacci函数,它对一个列表进行变异,以便将该列表作为fib序列返回。我想做同样的事情。。。但是列表(在本例中为元组)不应该能够更改。返回仍然必须发送整个列表,我如何实现它,而不使用递归

如果x=6。。。列表应返回{1,1,2,3,5,8}

我正在运行python 3.5

这是我的密码:

def mutableFib(x):
result = []
for y in range(0,x):
    if y < 2:
        result.append(1)
    else:
        last = result[y - 1]
        previous = result[y - 2]
        result.append(last + previous) //result is being changed
return result
def可变fib(x):
结果=[]
对于范围(0,x)内的y:
如果y<2:
结果。追加(1)
其他:
最后=结果[y-1]
先前=结果[y-2]
result.append(last+previous)//正在更改结果
返回结果

您可以为每个新元素创建一个新列表

def fibonacci(x):
    list_of_fibonaccis = []
    for y in range(0,x):
        if y < 2:
            temp_fibonacci = [1] * (y + 1)
        else:
            last = list_of_fibonaccis[y-1][-1]
            previous = list_of_fibonaccis[y-1][-2]
            temp_fibonacci = list_of_fibonaccis[y-1] + [last + previous]
        list_of_fibonaccis.append(temp_fibonacci)
    return list_of_fibonaccis[-1]
def fibonacci(x):
fibonaccis的列表=[]
对于范围(0,x)内的y:
如果y<2:
临时斐波那契=[1]*(y+1)
其他:
last=光纤通信的列表[y-1][1]
previous=fibonaccis列表[y-1][2]
临时斐波那契=斐波那契列表[y-1]+[last+previous]
fibonaccis.append的列表(临时fibonacci)
fibonaccis[-1]的返回列表

如果我理解你所说的“不使用递归的函数方法”,那么输入参数应该是前n个Fibonacci数的列表,输出应该是前n+1个Fibonacci数的列表。如果这是正确的,那么您可以使用

def fibonacci(fib):
    if not fib: return [1]
    if len(fib) == 1: return [1,1]
    return fib + [fib[-1]+fib[-2]]

考虑更改列表和创建新元组之间的区别,然后根据需要重构。请格式化您的代码。您还可以同时添加两个元组,这不会改变结果仍在修改的事实。我需要一种功能性更强的编程方法。。。我不知道怎么做,我明白你的意思,并且更新了我的答案。然而,我不明白你为什么要这样做,或者你所说的“功能性”是什么意思……在这个。。。在for循环中,temp_fibonaccis和list_of_fibonaccis都在不断变化。我们的目标是避免这样做。temp_fibonacci只是对实际列表的引用,它不会被更改。它是对已更改的最新斐波那契序列的引用。一旦fibonacci序列被制作出来,它们就被存储在fibonaccis的列表中,不会被进一步更改。此外,不可能有一个不变的列表,因为计算机一次只能做一件事(除非你是多处理的)。这意味着任何列表的元素都必须一个接一个地放置到位,而不是同时放置到位。