簡體   English   中英

理解Python引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM