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,特別是如果你不熟悉指針的概念。