List[:] = List 在这个基数排序代码中做了什么?

What does List[:] = List do in this radix sort code?

What is wrong with my radix sort?

这是我找到的 link 基数排序代码。它有效(最佳答案的代码)但我的问题是 List[:] = [] 在这种情况下做了什么(我知道它用于列表拆分)。我的意思是你想在每次迭代后从桶中重建列表,但是当我将该行更改为 List = [] 时,代码停止工作。为什么会这样?

考虑以下案例,这是您试图理解的内容的缩影:

def foo(x):
    x = []
    x.append(1)
    print(x)

my_list = []
foo(my_list)
print(my_list)

您希望函数 foo 清除它作为参数接收的列表,然后通过附加数字 1 对其进行修改,对吗?实际上,情况并非如此...

>>> foo(my_list)
[1]
>>> print(my_list)
[]

为什么会这样?

因为当您写 x = [] 时,您实际上 更改了局部变量 x 以引用新列表 ,而不是清除原始列表。另一方面,my_list仍然指的是原来的列表!

现在,让我们尝试相同的方法,但使用 x[:] 代替:

def foo(x):
    x[:] = []
    x.append(1)
    print(x)

my_list = []
foo(my_list)
print(my_list)

现在,一切都应该如您所愿:

>>> foo(my_list)
[1]
>>> print(my_list)
[1]

x[:] 技巧基本上是告诉解释器用一个新的空列表 替换x 引用的列表的内容。现在,它不是 x 将更改为它指向的列表。事实上,它仍将引用与 my_list 相同的列表,作为副作用,这将改变原始列表。

为了真正掌握幕后发生的事情,请查看 how variables are passed by assignment in Python,特别是如果您不熟悉指针的概念。