2017-08-03 54 views
0

當在Python 3中使用random模塊random.shuffle(list(range(n)))工作,但random.shuffle(range(n))沒有。爲什麼random.shuffle(list(range(n)))有效,但random.shuffle(range(n))不?

這是爲什麼?

當我輸入type(range(n))時,它返回range

+3

您的問題涉及哪種語言? – Smile4ever

+0

謝謝你,這是python –

+1

你的問題是不正確的,如書面。輸入'random.shuffle(list(range(n)))'不會**工作,因爲'random.shuffle'就地工作並且不返回任何東西。將它應用到動態創建的參數將不會產生任何可見的結果。 – pjs

回答

0

Python 3的range現在返回一個範圍對象(構造一個不變的序列)而不是一個列表(如Python 2)!

一個range-object(除了其他差異)不支持項目的分配,這是你觀察到(可能)錯誤:

File ".../random.py", line 272, in shuffle 
    x[i], x[j] = x[j], x[i] 
TypeError: 'range' object does not support item assignment 

線272是在python交換兩個變量的Python的路,這是大多數隨機算法中的常見操作(如Fisher-Yates)。

docs也提到了這一點(如果你想整理序列):

要洗牌不可變的序列,並返回一個新的洗牌列表,使用樣品(X,K = LEN(X)),而不是

那麼這將工作(和相當於給出洗牌的任務):

shuffled_list = random.sample(range(n), k=n) 

你首先創建一個列表的方式也未嘗不可,如果你能負擔得起的內存/時間。

相關問題