【发布时间】:2020-08-25 08:23:42
【问题描述】:
这是什么奇怪的魔法?
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() 那样手动更新每个值?或者这种事情通常会通过处理从函数返回的新列表来完成吗?
【问题讨论】:
-
因为short-description-of-the-scoping-rules - 你在函数内部创建了一个局部变量。请参阅下文了解如何修复
-
因为
lst[-n:] + lst[:-n]创建了一个新列表。您的函数只是将其分配给局部变量,并且在函数终止时丢弃该对象。 IOW,rotate_list根本不会改变列表,而rotate_list_2会。如果你确实想用这种方法改变列表,你可以做lst[:] = lst[-n:] + lst[:-n] -
所以,请阅读以下内容:nedbatchelder.com/text/names.html 注意,这实际上与列表无关。这里的语义总是相同的。 赋值永远不会改变.
标签: python list scope mutability