[英]Understanding Python references
鑒於python中的所有內容都是通過引用,我確實理解下面的代碼中發生了什么:
a = ['one']*3 // a = ['one', 'one', 'one']
b = [a]*3 // b = [['one', 'one', 'one'], ['one', 'one', 'one'], ['one', 'one', 'one']]
b[1][2] = 'two'
現在,b是
[['one', 'one', 'two'], ['one', 'one', 'two'], ['one', 'one', 'two']]
因為我們提出b
指通過稱作同一對象三次a
,重新分配部件的任何一個,改變被認為在三個地方。
但是,為什么同樣的事情發生時
a = [['one']]*3 // a = [['one'], ['one'], ['one']]
a[1] = ['two']
不會使a = ['two', 'two', 'two']
,而只是[['one'], ['two'], ['one']
,好像現在有三個不同的對象指向。
我在這里錯過了一些邏輯嗎?
提前謝謝,Nikhil
您沒有更改a[1]
的內容,而是將其重新綁定為指向單獨的數組。 這對a[0]
和a[2]
沒有影響。
請嘗試以下方法:
In [4]: a = [['one']]*3
In [5]: a[1][0] = 'two'
In [6]: a
Out[6]: [['two'], ['two'], ['two']]
可能我發現理解引用如何工作的最好方法是在Python Tutor中通過模擬器運行它們(單擊該鏈接將運行上面的示例)。 這使情況非常清楚。 這篇文章也值得一讀。
要記住的一個關鍵事項是,對象具有存在性和獨立於指向它們的名稱的身份; 和x = y
並不意味着“改變對象的價值指向x
什么y
指向”。 它意味着“使x
指向y
指向的東西”。
使用id
可能有助於澄清發生了什么:
>>> a = [['one']]*3
>>> (id(a[0]), id(a[1]), id(a[2]))
(140193404836320, 140193404836320, 140193404836320)
>>> a[1] = ['two']
>>> (id(a[0]), id(a[1]), id(a[2]))
(140193404836320, 140193368088088, 140193404836320)
最初, a[0]
, a[1]
和a[2]
都是同一個對象,正如人們所期望的那樣:
+------+------+------+ a -->| | | | +------+------+------+ \ | / | | | v v v +---------+ | ['one'] | +---------+
然后a[1] = ['two']
使a[1]
指向一個新對象:
+------+------+------+ a -->| | | | +------+------+------+ | | | | | | | | | | v | | +---------+ | | | ['two'] | | | +---------+ | | | | +---------+ | \> | ['one'] |</ +---------+
請注意,該圖表已經過簡化,以顯示要點, ['one']
和['two']
不是簡單的值,因為它們出現在圖表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.