Python索引用法

时间:2012-12-30 22:52:14

标签: python indexing

这是一些代码:     #问题9:深度反转     #定义一个过程,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将会改变。这是我解决这个问题的问题。

1 个答案:

答案 0 :(得分:0)

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

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

在python中有一个名为 list slicing 的东西,我相信你听说过它。基本上,您可以使用bar = 2indexAindexB获取部分列表。

但您也可以将这些空格留空。 my_list[indexA:indexB]如果未指定,则默认为indexA0默认为indexB(列表的最后一个元素)。

因此-1会将my_list[2:]中的所有元素都返回到my_list[2]。同样,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_reverse,则列表实际上不会更改(您将返回副本的反向而不是原始列表)