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



这是什么奇怪的魔法?

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()中那样手动更新每个值的情况下旋转原始列表?或者这类事情通常会通过处理函数返回的新列表来完成吗?

在函数中指定列表不会更改原始引用
赋值仅引用新值上的局部参数lst
在函数外部("之前"(引用的原始列表保持不变

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)

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

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

这将导致

10
4

为数组赋值之所以有效,是因为您没有为参数本身赋值。相反,您正在访问数组读取的内存,并对其进行更改。因此,即使对于外部作用域,这些更改也会发生。

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

最新更新