2017-04-03 57 views
1

我有一個對象列表。一旦創建,列表不會改變 - 但是對象屬性的值將會改變。保持列表中對象「指針」的最佳方式是什麼?

我需要在任何時候在列表中維護兩個「指針」。例如,「這個」,「那個」

我能做到這一點僅僅是保持兩個數字指標:

this=3 
that=7 
doSomething(mylist[this]) 
doSomethingElse(mylist[that]) 
this=9 
doSomethingNew(mylist[this]) 

或者,我可以通過引用而不是對象做到這一點? e.g像

this=mylist[3] 
that=mylist[7] 
doSomething(this) 
doSomethingElse(that) 
this=mylist[9] 
doSomethingNew(this) 

將在「此」影響到列表中的對象,而不是它的一個副本,所有的操作即更改將被保留?

+0

依賴於在該列表中的對象。如果它是不可變的,那麼你不應該擔心,如果它是可變的,你傳遞的是對象的引用,並且你不能有任何*保證對象狀態不變* –

+0

什麼樣的對象是這些?如果類定義是你的,請將其添加。 –

+0

對象的屬性值將隨時間而改變。 –

回答

2

「this」的所有操作是否會影響列表中的對象,而不影響列表中的對象,即更改將被保留?

是的。該列表只包含相同對象的引用。

什麼是保持列表中的對象的「指針」的最佳方式是什麼?

你提到「一旦創建,列表不會改變」,這麼多的它是否是更好地維護索引到列表,或者只是對象本身,是這裏無關緊要的參數。

那麼你對指數做了什麼?

  • 如果你只使用的索引,以便訪問對象(通過list.__getitem__),那麼你可能也只是保持直接的對象的引用。
  • 如果您關心指數的價值,例如列表中這對項之間的距離,或者是否在列表的開始/結束/中間,然後使用整數。

自定義類可能是一個很好的選擇,但您必須發佈更多的代碼並描述用例才能獲得可靠的建議。

1

只要你不重新分配對象本身,任何方法都可以工作。這些對象是可變類型嗎?

重新分配也取決於你的方法如何工作。

我強烈建議您在發佈之前完成您應該完成的研究:編寫您想要做的簡單版本的代碼,嘗試每種方法,並查看每個版本是否具有您需要的功能。


如果它們都工作,那麼您需要根據軟件設計問題來決定:是否易於閱讀?它快嗎?易於維護嗎?他人理解容易嗎?

例如,有幾次,我選擇了一個較慢的算法(例如冒泡排序而不是基於指針的合併排序),因爲這個列表永遠不會變得足以讓時間差異變得很重要,而且冒泡排序是某種東西任何現在或將來,我的團隊中的軟件負責人都能理解和維護。

1

TL; DR:是的,所有更改爲thisthat將顯示在列表中。這是因爲Python中的變量賦值方式 - (可變)名稱是對值的引用。

請參閱本文就如何變量賦值在Python的工作原理:Facts and myths about Python names and values

從文章

有用的片段:「一個Python賦值語句與右側的值在左側相關聯的符號名在Python中,我們說名稱是指值,或者名稱是對值的引用......如果您有列表元素引用其他可變值(如子列表),請務必記住列表元素是隻是參考價值。「

另一個有用的資源,以瞭解在Python變量和分配是如何工作的:http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables

相關問題