我有以下類別的卡: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
創建新對象。

慕村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
添加回答
舉報
0/150
提交
取消