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)
这是什么奇怪的魔法?
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)