What is wrong with my radix sort?List [:] = List在这个基数排序代码中做什么?
这是我发现的基数排序代码的链接。它的工作原理(最佳答案的代码),但我的问题是List [:] = []在这种情况下做了什么(我知道它意味着列表分割)。我的意思是你想在每次迭代之后从桶中重建列表,但是当我将该行更改为List = []时,代码停止工作。为什么?
What is wrong with my radix sort?List [:] = List在这个基数排序代码中做什么?
这是我发现的基数排序代码的链接。它的工作原理(最佳答案的代码),但我的问题是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,特别是如果你不熟悉指针的概念。