Python 重新分配变量时不会发生列表突变。为什么?

Python List Mutation Doesn't Happen When Variable Reassigned. Why?

这是什么奇怪的魔法?

def rotate_list(lst, n):
    n = n % len(lst)
    lst = lst[-n:] + lst[:-n]
    
def rotate_list_2(lst):
    lst[0], lst[1], lst[2], lst[3] = lst[3], lst[0], lst[1], lst[2]
    
                 
s1 = [1, 2, 5, 4]
rotate_list(s1, 1)
print(s1)

s1 = [1, 2, 5, 4]
rotate_list_2(s1)
print(s1)

输出:

[1, 2, 5, 4]
[4, 1, 2, 5]

虽然列表通常在函数内是可变的,但如果创建了同名列表,则原始列表不会受到新列表更改的影响。有人可以根据范围和参考资料解释这里发生的事情吗?

如何旋转原始列表而不必像 rotate_list_2() 那样手动更新每个值?或者这种事情通常会通过使用从函数返回的新列表来完成吗?

如果您重新分配函数的参数,该值不会在函数范围之外更改。

def test0(a):
    a = 10
    print(a)

x = 4
test0(x)
print(x)

这会导致

10
4

数组赋值有效的原因是您没有为参数本身赋新值。相反,您访问的是数组从中读取的内存,并且您正在更改它。因此,即使对于外部范围也会发生这些更改。

在函数中分配给列表不会更改原始引用。
该赋值仅引用新值上的局部参数 lst
在 ('before') 函数之外引用的原始列表保持不变。

Insead 使用以下语法分配给它的元素:

def rotate_list(lst, n):
    n = n % len(lst)
    lst[:] = lst[-n:] + lst[:-n]

s1 = [1, 2, 5, 4]
rotate_list(s1, 1)

# And it works like magic! :)
# [4, 1, 2, 5]
print(s1)

更改函数后,您可以 return 列表并在函数调用中捕获它,例如 s=function(s)