亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 類實例的復制/引用問題

Python 類實例的復制/引用問題

慕少森 2023-09-05 20:36:36
我有以下類別的卡:class Card:    def __init__(self, number, position):        self.number = number        self.position = position * 50        self.rect = pg.Rect(self.position, 0, 50, 100)    def draw(self, surface):        pg.draw.rect(surface, green, (self.position, 0, 50, 100))        ## pg.draw.rect(surface, green, self.rect)我想并排創建 16 張不同的卡片,從 0 到 800,每張卡片的寬度= 50。他們的數字是 0 到 7,然后又是 0 到 7。對于這個問題我已經想出了一個解決方案,那就是:cards = []for n in range(16):    cards.append(Card(n%8, n))然而,一路上出現的破損解決方案給我留下了未解答的問題。例如:cards = [Card(n, 0) for n in range(8)] * 2for n in range(16):    cards[n].position = n * 50在這里,我意識到cards[0] is cards[8]回報True。結果是只有最后一半的卡片出現在屏幕上。顯然,這與發生在以下情況的情況相同:cards = [Card(n, 0) for n in range(8)]cards.extend(cards)但我想將第二行更改為:cards.extend(cards[:])可以解決制作副本而不是參考的問題,但它仍然不起作用。這就是我想要解釋的事情。有沒有一種簡單的方法可以解決前兩種情況中的副本與參考問題?另一個問題是繪制方法的注釋版本。在我使用的一些損壞的方法中,這個版本不起作用,因為它從不更新位置,位置總是卡在0。似乎在類之外,沒有收到 的值,盡管我可以直接card.rect[0]在card.position內部self.position使用繪制方法。這里到底是怎么回事self.rect?
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

循環

cards = []
for n in range(16):
   cards.append(Card(n%8, n))

運行16次。因此構造了 16 個Card對象并附加到一個列表中。最后,您將獲得該類的 16 個獨立實例Card和一個包含 16 個元素的列表。

但表達

cards  = [Card(n, 0) for n in range(8)] * 2

創建16 個Card對象。它構造 8 個Card對象和一個包含 16 個元素的列表,其中每個對象包含兩次。Card (n, 0)僅被調用 8 次,因此只能有 8 個實例Card。

這同樣適用于

cards.extend(cards[:])

[:]創建列表的淺表副本。該列表僅包含對對象的引用。復制列表以及對對象的引用,但不復制對象本身,但不會Card創建新對象。


查看完整回答
反對 回復 2023-09-05
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

這與Python如何存儲整數有關。從 -5 到 255 的“常見”整數已存儲在內存中。當您分配像這樣的變量時,您正在創建一個指向內存中已有的a = 1“硬編碼”整數的指針,而不是實例化一個新整數。1任何時候您創建此范圍內的整數時,它都不會是新數字,因此這將起作用:


>>> a = 7

>>> b = 7

>>> a is b

True

而對于此范圍之外的數字:


>>> a = 1234

>>> b = 1234

>>> a is b

False

因此:


>>> a = [1, 2, 3]

>>> b = [1, 2, 3]

>>> a[0] is b[0]

True


>>> a is b

False


查看完整回答
反對 回復 2023-09-05
  • 2 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號