2012-08-22 28 views

回答

41

Python的變量保持引用。因此,當您定義palin列表時,您傳遞的是polly引用的值,而不是變量本身。

您應該將值想象成氣球,變量是線程綁定到這些氣球。 "alive"是一個氣球,polly只是一個線程到那個氣球,並且palin列表有一個不同線程綁定到同一個氣球。在Python中,列表僅僅是一系列的線程,在0

你下一步做什麼polly繩子綁到一個新的氣囊"dead"都開始編號,但名單仍抱着舊線綁"alive"氣球。

您可以將該線程替換爲該列表所持有的"alive",方法是通過重新分配索引列表來引用每個線程;在您的例子是線程1

>>> palin[1] = polly 
>>> palin 
['parrot', 'dead'] 

這裏我簡單的palin[1]線連接到相同的事情polly被綁定到,不管這可能是。

請注意,python中的任何集合,如dictset,tuple等都只是線程的集合。其中一些可以將它們的線程交換出來用於不同的線程,比如列表和字典,這就是python中「可變」的東西。

字符串另一方面,不是 mutable。一旦你定義了一個像"dead""alive"這樣的字符串,它就是一個氣球。你可以用一個線程(一個變量,一個列表或任何其他)綁定它,但你不能替換它內部的字母。您只能將該線程綁定到完全新的字符串。

python中的大多數事情可以像氣球一樣。整數,字符串,列表,函數,實例,類,所有可以綁定到一個變量,或捆綁到一個容器中。您也可以閱讀Ned Batchelder's treatise on Python names

+0

謝謝,我現在相信我問了一個不正確的問題但是謝謝 – Flexo1515

+10

我喜歡氣球的類比 - 特別是如果他們是氦氣球,當最後一個字符串被釋放時它會飄離......(+1)。 – mgilson

+0

@ user1404053:我更新了一些以解釋字符串是如何不可變的。你必須用另一個替換一個字符串「氣球」。 –

4

你的第二個print語句之前,存儲新值到palin

palin = ["parrot", polly] 
+0

無論如何? – Flexo1515

+3

@ user1404053:不是你問的方式。在Python中,字符串是不可變的,所以沒有辦法改變'polly'中的值,因此在其他地方改變它。 'polly ='dead''這一行是[rebinding操作而不是變異操作](http://en.wikipedia.org/wiki/Name_binding#Rebinding_and_mutation) –

0

該列表將僅包含值,而不是您想要的變量的引用。然而,你可以在列表中存儲一個lambda,並讓lambda查找變量的值。

>>> a = 'a' 
>>> list = ['a',lambda: a] 
>>> list[1] 
<function <lambda> at 0x7feff71dc500> 
>>> list[1]() 
'a' 
>>> a = 'b' 
>>> list[1]() 
'b' 
+0

更多解釋:這裏'lambda:a'基本上是一個返回存儲在'a'中的值的函數。這就是爲什麼你可以使用命令'list [1]()';它意味着你調用存儲在'list [1]'中的函數。 (另外,適當的gravatar,@Jonatan) –

+0

非常正確,謝謝你的解釋。我也完全忘記了我的頭像,哈哈! – Jonatan

3

當您將一個字符串放入一個列表中時,該列表將包含該字符串的一個副本。這個字符串最初是一個變量,一個字面值,一個函數調用的結果還是別的什麼都沒關係;在列表看到它時,它只是一個字符串值。稍後改變生成的字符串不會影響列表。

如果你想存儲一個值的引用,該值會在該值發生變化時發現,通常的機制是使用包含「引用」值的列表。應用到你的例子,你結束了一個嵌套列表:

polly = ["alive"] 
palin = ["parrot", polly] 
print(palin) 
polly[0] = "dead" 
print(palin) 
0

你不能。分配給裸名稱的是Python總是隻重新綁定名稱,並且您不能自定義或監視此操作。

你可以做的是讓polly成爲一個可變對象而不是字符串,並且改變它的值而不是重新命名名稱。一個簡單的例子:

>>> polly = ['alive'] 
>>> items = ['parrot', polly] 
>>> items 
['parrot', ['alive']] 
>>> polly[0] = 'dead' 
>>> items 
['parrot', ['dead']] 
0

其他答案已經解釋了怎麼回事。

這是激勵使用對象的(幾個)問題之一。例如,一個可能做到這一點:

class Animal: 
    def __init__(self, aniType, name): 
     self.aniType = aniType 
     self.name = name 
     self.isAlive = True 

    def kill(self): 
     self.isAlive = False 

    def getName(self): 
     return self.name 

    def getType(self): 
     return self.aniType 

    def isLiving(self): 
     return self.isAlive 


polly = Animal("parrot", "polly") 

print(polly.getName()+' the '+polly.getType()+' is alive?') 
print(polly.isLiving()) 

polly.kill() 

print(polly.getName()+' the '+polly.getType()+' is alive?') 
print(polly.isLiving()) 

它可能看起來像在第一個簡單的任務,大量的代碼,但對象是經常去這樣的事情的方式,因爲它們有助於保持組織的一切。

下面是程序的輸出:

polly the parrot is alive? 
True 
polly the parrot is alive? 
False