Python 反向变异输入法

Python 反向变异输入法,python,iteration,mutation,Python,Iteration,Mutation,对于赋值,我们被要求创建一个函数来反转任意嵌套列表中的所有元素。因此,函数的输入应返回如下内容: >>> seq = [1,[2,[3]]] >>> print arb_reverse(seq) [[[3],2],1] >>> seq = [9,[[],[0,1,[[],[2,[[],3]]]],[],[[[4],5]]]] >>> print arb_reverse(seq) [[[[5,[4]]],[],[[[[3,[]

对于赋值,我们被要求创建一个函数来反转任意嵌套列表中的所有元素。因此,函数的输入应返回如下内容:

>>> seq = [1,[2,[3]]]
>>> print arb_reverse(seq)
[[[3],2],1]
>>> seq = [9,[[],[0,1,[[],[2,[[],3]]]],[],[[[4],5]]]]
>>> print arb_reverse(seq)
[[[[5,[4]]],[],[[[[3,[]],2],[]],1,0],[]],9]
我提出了一个递归解决方案,效果很好:

def arb_reverse(seq):
    result = []
    for element in reversed(seq):
        if not is_list(element):
            result.append(element)
        else:
            result.append(arb_reverse(element))
    return result
但是出于个人的一点挑战,我想创建一个不使用递归的解决方案。这种尝试的一个版本导致了一些我不理解的奇怪行为。为了澄清,我并不期望这个版本能正常工作,但由此产生的输入突变没有意义。以下是有问题的迭代版本:

def arb_reverse(seq):
    elements = list(seq)   #so input is not mutated, also tried seq[:] just to be thorough
    result = []
    while elements:
        item = elements.pop()
        if isinstance(item, list):
            item.reverse() #this operation seems to be the culprit
            elements += item 
        else:
            result.append(item)
    return result
这将返回一个平坦的半反转列表(有些是预期的),但有趣的部分是它对输入的作用(不是预期的)

我的印象是,通过使用
list()
input[:]
将输入中包含的值传递给变量,就像我对
元素所做的那样,可以避免对输入进行变异。然而,一些印刷声明后来透露,反向方法在改变原始列表中起了作用。这是为什么?

list()调用正在生成一个新列表,其中包含从原始列表复制的浅层列表

试试这个(偷来的):

list()调用正在生成一个新列表,其中包含从原始列表复制的浅层列表

试试这个(偷来的):


尝试通过此工具运行以下代码

具体看一下调用
l2[0]时会发生什么


您将看到,当您调用
list()
创建列表副本时,列表仍然引用相同的对象。

尝试通过此工具运行以下代码

具体看一下调用
l2[0]时会发生什么


您将看到,当您调用
list()
创建列表副本时,列表仍然引用相同的对象。

我假设var=input[:]是否也这样做?因此,即使创建了一个新列表,它仍然引用填充列表的原始值?无需导入外部模块,我想我必须迭代原始列表,并确保以某种方式复制所有值?它是一个内置库:…但是如果你感到受虐狂,你当然可以使用你自己的递归深度复制函数。自我造成的痛苦教会了我一些我不会很快忘记的教训!ThanksI假设var=input[:]是否也这样做?因此,即使创建了一个新列表,它仍然引用填充列表的原始值?无需导入外部模块,我想我必须迭代原始列表,并确保以某种方式复制所有值?它是一个内置库:…但是如果你感到受虐狂,你当然可以使用你自己的递归深度复制函数。自我造成的痛苦教会了我一些我不会很快忘记的教训!感谢尚未完成此操作,我假设复制的列表仍然引用填充原始列表的对象?确切地说,它只是列表的一个浅副本,并不复制列表包含的对象。考虑到需要单独的函数来创建真正的副本,对于一个解决方案,在迭代过程中,递归在多大程度上有意义?如果还没有这样做,我假设复制的列表仍然引用填充原始列表的对象?确切地说,它只是列表的一个浅副本,它不会复制列表中包含的对象。考虑到需要一个单独的函数来创建一个真正的副本,对于一个解决方案,在迭代过程中递归的长度是多少?
>>> a = [1, [2, [3]]]
>>> arb_reverse(a)
[2, 3, 1]
>>> a
[1, [[3], 2]]
>>> p = [1, [2, 3, [4, [5, 6]]]]
>>> print arb_reverse(p)
[2, 3, 4, 5, 6, 1]
>>> print p
[1, [[[6, 5], 4], 3, 2]]
from copy import deepcopy
listB = deepcopy(listA)
o1 = [1, 2, 3]
o2 = [4, 5, 6]

l1 = [o1, o2]

l2 = list(l1)

l2[0].reverse()

print l2
print l1