。我如何得到它輸出?Python列表並不反映變量的變化
回答
Python的變量保持引用值。因此,當您定義palin
列表時,您傳遞的是polly
引用的值,而不是變量本身。
您應該將值想象成氣球,變量是線程綁定到這些氣球。 "alive"
是一個氣球,polly
只是一個線程到那個氣球,並且palin
列表有一個不同線程綁定到同一個氣球。在Python中,列表僅僅是一系列的線程,在0
你下一步做什麼polly
繩子綁到一個新的氣囊"dead"
都開始編號,但名單仍抱着舊線綁"alive"
氣球。
您可以將該線程替換爲該列表所持有的"alive"
,方法是通過重新分配索引列表來引用每個線程;在您的例子是線程1
:
>>> palin[1] = polly
>>> palin
['parrot', 'dead']
這裏我簡單的palin[1]
線連接到相同的事情polly
被綁定到,不管這可能是。
請注意,python中的任何集合,如dict
,set
,tuple
等都只是線程的集合。其中一些可以將它們的線程交換出來用於不同的線程,比如列表和字典,這就是python中「可變」的東西。
字符串另一方面,不是 mutable。一旦你定義了一個像"dead"
或"alive"
這樣的字符串,它就是一個氣球。你可以用一個線程(一個變量,一個列表或任何其他)綁定它,但你不能替換它內部的字母。您只能將該線程綁定到完全新的字符串。
python中的大多數事情可以像氣球一樣。整數,字符串,列表,函數,實例,類,所有可以綁定到一個變量,或捆綁到一個容器中。您也可以閱讀Ned Batchelder's treatise on Python names。
你的第二個print語句之前,存儲新值到palin
:
palin = ["parrot", polly]
無論如何? – Flexo1515
@ user1404053:不是你問的方式。在Python中,字符串是不可變的,所以沒有辦法改變'polly'中的值,因此在其他地方改變它。 'polly ='dead''這一行是[rebinding操作而不是變異操作](http://en.wikipedia.org/wiki/Name_binding#Rebinding_and_mutation) –
該列表將僅包含值,而不是您想要的變量的引用。然而,你可以在列表中存儲一個lambda,並讓lambda查找變量的值。
>>> a = 'a'
>>> list = ['a',lambda: a]
>>> list[1]
<function <lambda> at 0x7feff71dc500>
>>> list[1]()
'a'
>>> a = 'b'
>>> list[1]()
'b'
更多解釋:這裏'lambda:a'基本上是一個返回存儲在'a'中的值的函數。這就是爲什麼你可以使用命令'list [1]()';它意味着你調用存儲在'list [1]'中的函數。 (另外,適當的gravatar,@Jonatan) –
非常正確,謝謝你的解釋。我也完全忘記了我的頭像,哈哈! – Jonatan
當您將一個字符串放入一個列表中時,該列表將包含該字符串的一個副本。這個字符串最初是一個變量,一個字面值,一個函數調用的結果還是別的什麼都沒關係;在列表看到它時,它只是一個字符串值。稍後改變生成的字符串不會影響列表。
如果你想存儲一個值的引用,該值會在該值發生變化時發現,通常的機制是使用包含「引用」值的列表。應用到你的例子,你結束了一個嵌套列表:
polly = ["alive"]
palin = ["parrot", polly]
print(palin)
polly[0] = "dead"
print(palin)
你不能。分配給裸名稱的是Python總是隻重新綁定名稱,並且您不能自定義或監視此操作。
你可以做的是讓polly
成爲一個可變對象而不是字符串,並且改變它的值而不是重新命名名稱。一個簡單的例子:
>>> polly = ['alive']
>>> items = ['parrot', polly]
>>> items
['parrot', ['alive']]
>>> polly[0] = 'dead'
>>> items
['parrot', ['dead']]
其他答案已經解釋了怎麼回事。
這是激勵使用對象的(幾個)問題之一。例如,一個可能做到這一點:
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
- 1. 控制變量的變化並不能反映角模式
- 2. angular.copy反映分配變量的變化
- 3. 環境變量的變化沒有反映在python
- 4. 片段不反映變化
- 5. bootstrap少不反映變化
- 6. 反序列化cookie變量
- 7. IE8的DOM不反映JS的變化
- 8. DataContractSerializer不反序列化所有變量
- 9. 初始化後變量變化未反映在界面
- 10. GridView不反映AJAX的變化
- 11. Datagridview不反映數據集的變化
- 12. djangorestframework不能反映資源的變化
- 13. 不反映ng-view的變量的值
- 14. 爲什麼不附加列表反映變量更改?
- 15. 角度ng顯示沒有反映變量的變化
- 16. 如何將LabelMorph/TextMorph綁定到變量,以便Morph反映變量的變化?
- 17. Joomla的組件來源的變化並不反映
- 18. 範圍變化不會反映
- 19. 刀片視圖不反映變化
- 20. 變化不會反映在JS
- 21. 數據綁定不反映變化
- 22. Angularjs - 範圍變化不反映
- 23. ProgressBar不反映價值變化C#
- 24. 變化不會反映在模式UI
- 25. java反映私有變量
- 26. 反映本地變量
- 27. QML GridView並不反映C++模型中的變化
- 28. 指令變化並不反映我的網頁控制器上
- 29. IE9並不反映頁面javascript的變化
- 30. C結構變量沒有反映變化
相關:做而不恢復新值http://stackoverflow.com/q/11690220/748858 – mgilson