簡體   English   中英

當使用現有 class 的屬性創建新的 class 時,python 如何實例化屬性?

[英]How does python instantiate attributes when new class is created with attribute of existing class?

我有一個簡單的Point class 屬性zyz 我首先實例化第一個 object:

point1 = Point(1, 2, 3)

現在我像這樣實例化我的第二點:

point2 = Point(point1.x, 3, 4)

當我在點和屬性上運行id()時,我得到了這個

id(point1): 1565146411848: x: 1, y: 2, z: 3 id(point1.x): 140711867415616
id(point2): 1565146435400: x: 1, y: 3, z: 4 id(point2.x): 140711867415616

顯然,這兩個 Point 對象是唯一的,但是,它們似乎共享相同的x

現在,當我更改時,例如point2.x = 900 ,會發生以下情況:

id(point1): 1565146411848: x: 1, y: 2, z: 3 id(point1.x): 140711867415616
id(point2): 1565146435400: x: 900, y: 3, z: 4 id(point2.x): 1565143647248

point2.x現在與point1.x不同。 所以我假設在這些條件下分配時,會創建屬性x的新實例? 我不清楚 python 的規則是什么,我一直理解賦值不會導致實例化,但是看起來好像這正是這里發生的事情? 這是如何運作的?

Python 變量——這包括對象的成員以及諸如列表和字典元素之類的東西——是對值的引用 當您創建 point2 並將 point1.x 作為 x 值傳遞時,您將獲得對相同值的新引用。 這就是為什么它具有相同的ID。

在這種情況下,它真的無關緊要,因為整數是不可變的。 如果你的 x 是一個可變的 object 就像一個列表,這可能很重要。 試試看,當您通過任一對象的 x-reference 更改列表時會發生什么(您會看到通過一個變量所做的更改會影響另一個)。

在整數的情況下理解這種行為還有另一個輕微的復雜性,因為 CPython “實習生” 小整數。 也就是說,對 integer 1 的每次引用最終都會引用 1 的同一個副本。嘗試重復您的實驗,但按字面意思傳遞 1 而不是 point1.x,您就會明白我的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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