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

Python列表不';变量重新分配时不会发生。为什么?,python,list,scope,mutability,Python,List,Scope,Mutability,这是什么奇怪的魔法 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(s

这是什么奇怪的魔法

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\u list_2()
中那样手动更新每个值?或者这类事情通常是通过处理从函数返回的新列表来完成的?

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

def test0(a):
a=10
印刷品(a)
x=4
test0(x)
打印(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)

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

,因为-您在函数内部创建了一个局部变量。有关如何修复的信息,请参见下文,因为
lst[-n:]+lst[:-n]
创建了一个新列表。您的函数只是将其分配给一个局部变量,当函数终止时,对象将被丢弃。照此看来,
rotate\u list
根本不会改变列表,而
rotate\u list\u 2
会改变列表。如果你真的想用这种方法改变列表,你可以做
lst[:]=lst[-n:]+lst[:-n]
,所以,请阅读以下内容:注意,这实际上与列表无关。这里的语义总是相同的。赋值永远不会发生变化。因此,如果我将赋值给作为函数参数传入的列表,则函数将不再看到原始列表,而是创建一个局部列表变量??对新列表值的引用@RobinAndrews@RobinAndrews它是一个参数,总是局部的。不过,函数作用域中的赋值会创建局部变量。但在本例中,因为它是一个参数,所以它已经是本地的。