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,特别是如果您不熟悉指针的概念。
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,特别是如果您不熟悉指针的概念。