2012-01-01 129 views
3

指的是一個項目的名單上有從從另一個列表中(數組listB)變量(listA的)的列表。我遇到的問題是listB中的項目正在按值傳遞給listA而不是通過引用。無論如何,我可以訪問listB中的對象後,已將它的值在listA?Python從另一個列表

例如:

listB = [1,2,3,4,5] 
listA = [listB[0], listB[1]] 
listA[0] = 0 

這使得listA的等於[0,2],和葉數組listB不變。我想修改listB,使它變成[0,2,3,4,5]。

我當然有拿出一個解決的辦法,但它的醜陋,我在想,如果有這樣的一種優雅的方式。

+0

你不能。如果你想幫助解除一段代碼:發佈在http://codereview.stackexchange.com。有人會指出你的問題更優雅的解決方案。 – 2012-01-01 01:20:02

回答

1

一切都在蟒蛇是一個參考。所有這些語句執行後,listB[1]listA[1]字面上同一個對象。 (你可以檢查,通過調用id(listB[1])id(listA[1])

原因listA[0]listB[0]是不同的僅僅是因爲你把不同的參考到那個地方。

從你的描述來看,你不想給一個。listA存儲在listB的對象引用你需要的是一個listA這是一個鑑於listB我相信你只有兩種選擇:

  • 創建一個特殊的序列內部存儲參考listA,且其__getitem____setitem__方法被調用時執行查找到listA

  • 創建特別是包含有類似「序列和索引」特殊的引用類型。將這些參考文獻放入listA。但是,要修改listBlistA,您必須調用這些引用對象的某種「獲取」和「設置」成員。

1

你不能。首先整數是不可變的,它們不像C/C++中的整數那樣工作。你不能得到一個整數的指針/引用,然後改變它(我的意思是你可以,你總是有一個引用,但它通常引用單個對象;請檢查這個x = 1; y = 1; print id(x), id(y); id值應該是相同的,它們是內存地址)。你可以做的就是元素的索引數組listB和更改列表,例如:

listA = [0, 1] 
listB[listA[0]] = 0 

可能是你試圖做一些你不應該做的,因爲Python的工作方式不同於C++。你想達到什麼目的?

+0

我有一個大小爲n的數據矩陣,我正在檢查該矩陣的每個可能的2x2子集。然後我將這個2x2子集的4個值存儲在一個列表中,並檢查它們的值。根據該2x2子集的內容,我必須修改大小爲n的原始數據矩陣。 我認爲同樣的事情,存儲2x2矩陣所保持的原始矩陣的索引,但是這需要更復雜的數據類型和/或不太優雅的解決方案。由於我試圖提高我的python編程技能,我想知道是否有pythonian /優雅的做這個。 – 2012-01-01 01:23:16

+1

對於這樣的事情,我相信你應該使用NumPy或SciPy,這是爲此創建的python庫。如果你想使用純Python,你最好的選擇是記住子表的索引並改變列表中的值。只需將該子矩陣存儲的值存儲在該子矩陣的頂部角落,並在原始表格中更改值即可。也許你可以在C或C++中展示一個簡短的代碼片段(但認真,簡短),我們可以嘗試在Python中使用代碼,這也是一樣的。 – gruszczy 2012-01-01 01:24:50

+0

@AmeerOpat,對於你在做什麼我沒有一個真正清晰的想法,但我會建議考慮創建一個新的矩陣,而不是修改現有的矩陣。這通常會產生更多pythonic解決方案。 (正如我上面提到的,如果您在代碼審查上發佈更好的反饋) – 2012-01-01 01:40:18