这是一些代码: #问题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将会改变。这是我解决这个问题的问题。
答案 0 :(得分:0)
我现在就告诉你这里的答案,并附上解释。
在python中,变量只是存储对象的指针。正如您在帖子中所述,如果您声明foo = bar
,那么foo
不仅等于bar
,而且foo
{{1 }}。除非您明确说明(例如,您设置bar
),否则不会更改。因此,您需要一种方法来制作原始列表的副本。
在python中有一个名为 list slicing 的东西,我相信你听说过它。基本上,您可以使用bar = 2
从indexA
到indexB
获取部分列表。
但您也可以将这些空格留空。 my_list[indexA:indexB]
如果未指定,则默认为indexA
,0
默认为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
,则列表实际上不会更改(您将返回副本的反向而不是原始列表)