-3

下面是一些代码: # 问题 9:Deep Reverse # 定义一个过程 deep_reverse,它将一个列表作为输入, # 并返回一个新列表,该列表是输入列表的深度反向。
# 这意味着它反转列表中的所有元素,如果其中任何一个元素是列表本身,则反转内部列表中的所有元素,一直向下。

# Note: The procedure must not change the input list.

# The procedure is_list below is from Homework 6. It returns True if 
# p is a list and False if it is not.

def is_list(p):
    return isinstance(p, list)

#For example,
def deep_reverse(n):
    n.reverse()
    for entry in n:
        if is_list(entry):
            entry.reverse() 
            deep_reverseA(entry)        
    return n

def deep_reverseA(n):
    for entry in n:
        if is_list(entry):
            entry.reverse() 
            deep_reverseA(entry)          
    return n

p = [1, [2, 3, [4, [5, 6]]]]
print deep_reverse(p)
#>>> [[[[6, 5], 4], 3, 2], 1]
print p
#>>> [1, [2, 3, [4, [5, 6]]]]

q =  [1, [2,3], 4, [5,6]]
print deep_reverse(q)
#>>> [ [6,5], 4, [3, 2], 1]
print q
#>>> [1, [2,3], 4, [5,6]]

我的问题是,一旦我运行代码,p 和 q 的值就会改变。我怎样才能让他们不改变。我知道在 python 中索引是连接的,所以如果 indexA = indexB 并且您更改 indexA 那么 indexB 将会更改。这就是我在解决这个问题时遇到的问题。

4

1 回答 1

0

我现在就在这里告诉你答案,并附上解释。

在 python 中,变量只是指向存储对象的指针。因此,正如您在帖子中所说,如果您声明foo = barthenfoo不仅等于bar,而且foo barbar = 2除非您明确表示(例如您设置),否则这不会改变。因此,您需要一种方法来制作原始列表的副本

python 中有一个叫做list slicing的东西,我相信你听说过。基本上,您可以从indexAto indexBwith获取列表的一部分my_list[indexA:indexB]

但您也可以将这些空格留空。indexA如果未指定,则默认为0,并且indexB默认为-1(列表的最后一个元素)。

所以my_list[2:]返回所有元素 from my_list[2]to my_list[-1]。同样,my_list[:3]返回my_list[0]my_list[3]

因此,调用会my_list[:]返回 的精确副本my_list而不是实际列表本身。这是你需要做的。

因此将其应用于您的代码:

def deep_reverse(n):
    ncopy = n[:]  #this is the part you need
    #rest of function, replace `n` with `ncopy`
    return ncopy

此外,不要将此应用于deep_reverseA因为在该函数中您正在更改复制列表中的原始列表。您不会更改您输入的列表。如果您确实将其应用于,则列表实际上不会更改(您将返回副本的反面,而不是原件)deep_reversedeep_reverseA

于 2012-12-31T00:36:24.153 回答