如何永久改变列表?

时间:2021-01-27 22:33:28

标签: python function

def deep_reverse(L) :
    for i in range (len(L)-1,-1,-1):
        L=L[::-1]
    for i in range (len(L)-1,-1,-1):
        L[i]=L[i][::-1]  

L = [[0, 1, 2], [1, 2, 3], [3, 2, 1], [10, -10, 100]]
deep_reverse(L) 
print(L)

所以我在这里有这段代码和一个名为 deep_reverse(L) 的函数。我试图改变列表 L,最后当我 print(L) 它打印出 L = [[0, 1, 2], [1, 2, 3], [3, 2, 1], [10, -10, 100]]。但是,当我从函数内部打印时,我得到 L= [[2, 1, 0], [3, 2, 1], [1, 2, 3], [100, -10, 10]],这正是我想要的。我怎样才能永久改变 L 以便在我在函数外打印它时保持这种状态。

4 个答案:

答案 0 :(得分:2)

你没有改变任何东西。该函数创建一个新列表并将其分配回局部变量,这对调用者的变量没有影响。

此外,您的第一个 <div class="box"> </div> <div class="box" style="--p1_start:80px;--p1_end:100px;--p2_start:120px;--p2_end:200px;"> </div> 循环反复反转 for。如果列表有偶数个元素,则将其反转回原来的顺序。

使用切片分配就地修改列表。

L

另请注意,您的代码仅反转两层深。使用递归处理任何深度。

def deep_reverse(L):
    L[:]=L[::-1]
    for i in range (len(L)-1,-1,-1):
        L[i][:]=L[i][::-1] 

答案 1 :(得分:0)

问题在于通过调用 $token ='\"cbfddd256d9b5c5235f587415188ce2e36101c0c3269b6db398d4f53ad35898a\"'; preg_match('/[A-Za-z0-9]+/', $token, $matches); print_r($matches); // Array ( [0] => cbfddd256d9b5c5235f587415188ce2e36101c0c3269b6db398d4f53ad35898a ) 为 L 分配了一个新数组,并且不会覆盖传递给函数的数组。为此,您需要使用将新值分配为 L = L[::-1]

这样你的函数就变成了:

L[:] = L[::-1]

此外,我假设您希望反转单个元素,因此您不需要第一个 for 循环。

答案 2 :(得分:0)

就这么简单 - 就是尽量减少对代码的更改: (删除第一个循环 - 因为没有效果;并添加 return 语句)所有就地更改。

def deep_reverse(L):
    for i in range(len(L)-1, -1, -1):
        L[i] = L[i][::-1]
        
    return L


L = [[0,1,2], [1,2,3], [3,2,1], [10,-10,100]]

LL = deep_reverse(L)

print(LL)  # [[2, 1, 0], [3, 2, 1], [1, 2, 3], [100, -10, 10]]

答案 3 :(得分:0)

你说过如果 L = [[0, 1, 2], [1, 2, 3], [3, 2, 1], [10, -10, 100]]
想要结果 L = [[2, 1, 0], [3, 2, 1], [1, 2, 3], [100, -10, 10]]

基于Barmar's answer,您可以这样做:

def deep_reverse(L):
    for subL in L:
        subL[:] = subL[::-1]


>>> L = [[0, 1, 2], [1, 2, 3], [3, 2, 1], [10, -10, 100]]
>>> deep_reverse(L)
>>> L
[[2, 1, 0], [3, 2, 1], [1, 2, 3], [100, -10, 10]]
相关问题