2014-03-26 139 views
3

我最近學習瞭如何在Python中使用random.shuffle,並且我很驚訝地看到該函數在沒有返回任何東西的情況下對變量進行混洗。這個功能如何實現?看着隨機庫的源代碼沒有找到答案。Python更改變量

我該如何編寫自己的函數來更改變量而不重新分配?

+0

函數可以*更改狀態*它的參數,但它無法與新的對象替換參數。想象一下,你傳遞給一個函數的論點是一條繩索上的貼子。該功能可以在貼子上書寫新東西,但不能解開繩子並將其綁在香蕉上。 – user2357112

+0

比random.shuffle如何做到這一點? – pianist1119

+0

列表的內容是其狀態的一部分。 'random.shuffle'不會用新列表替換列表;它會更改列表的狀態。 – user2357112

回答

3

我是工作的,因爲列表是可變的。你不能重新分配任何變量,因爲它將是新變量。你不能修改不可變類型變量。您可以修改可變變量。

所以:

>>> def addone(x): 
...  x += 1 
>>> a = 2 
>>> addone(a) 
>>> a 
2 
>>> def addone(x): 
...  x.append(1) 
... 
>>> l=[2] 
>>> addone(l) 
>>> l 
[2, 1] 
>>> def addone(x): 
...  x = x + [1] 
... 
>>> li=[2] 
>>> addone(li) 
>>> li 
[2] 
+1

這是我正在尋找的信息,現在我知道要查看什麼(可變類型)的榮譽 – pianist1119

1

那麼,只要看看random.shuffle的執行情況。在一個名爲random.py的文件中找到它,這是一個純粹的Python實現,並且非常簡單 - 只需使用一個賦值循環(使用tuple解包)。

def shuffle(self, x, random=None, int=int): 
    """x, random=random.random -> shuffle list x in place; return None. 

    Optional arg random is a 0-argument function returning a random 
    float in [0.0, 1.0); by default, the standard random.random. 

    Do not supply the 'int' argument. 
    """ 

    if random is None: 
     random = self.random 
    for i in reversed(xrange(1, len(x))): 
     # pick an element in x[:i+1] with which to exchange x[i] 
     j = int(random() * (i+1)) 
     x[i], x[j] = x[j], x[i] 
+0

是的,但是如何在沒有返回語句的情況下更改該值? – pianist1119

+0

它重新分配x而不返回它 – pianist1119

+0

它不需要返回它。對象x是可變的,所以它被修改了。 – wim