我看到一些相關的問題,我想我的問題仍然沒有答案。我怎樣才能得到一個指向列表成員的指針(引用)?我說,我有:是否有可能獲得列表成員的指針?
>>> a = [None]
>>> d = a[0]
>>> d = 3
我期望能獲得:
>>> a
[3] # But I get [None] of course.
是否有可能在Python呢?或者我該如何實現?
UPDATE
我的最終目標是改變源。
我看到一些相關的問題,我想我的問題仍然沒有答案。我怎樣才能得到一個指向列表成員的指針(引用)?我說,我有:是否有可能獲得列表成員的指針?
>>> a = [None]
>>> d = a[0]
>>> d = 3
我期望能獲得:
>>> a
[3] # But I get [None] of course.
是否有可能在Python呢?或者我該如何實現?
UPDATE
我的最終目標是改變源。
不,這是不可能的。您不能存儲對列表中位置的引用,並嘗試稍後通過分配對其進行更新。
如果您想實現解決方法,那麼您可能希望使用閉包來捕獲對列表中所需索引的引用。這裏有一個例子:
# Here's my list
mylist = [1, 2, 3, 4]
# Save a reference to the list using a function to close over it
def myref(x): mylist[1] = x
# Update the referenced value to 7
myref(7)
# mylist is now [1, 7, 3, 4]
print mylist
您使用的是myref(7)
語法,而不是myref = 7
語法,因爲沒有辦法超載在Python賦值操作符卡住了,但我認爲這會爲你工作。
在您對其他答案之一的評論中,您提到您實際上是在處理n維列表,並且您希望保存一個參考,以便稍後在索引不在範圍內時更新它。這也適用於這種情況。這裏有一個例子:
# My 3D list
list3D = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
# Find
def findEntry(data, x):
for i, page in enumerate(data):
for j, row in enumerate(page):
for k, col in enumerate(row):
if col == x:
def myref(y): data[i][j][k] = y
return myref
# Get a reference to the first cell containing 4
updater = findEntry(list3D, 4)
# Update that cell to be 44 instead
updater(44)
# list3D is now [[[1, 2], [3, 44]], [[5, 6], [7, 8]]]
print list3D
使用ref單元比使用指針更好。指針是從Python的角度來看的一個遙遠的概念。您可以從列表中製作廉價的參考單元。
pointer = [3]
pointer[0] = 5 #change value of ref cell
pointer[0] #get value of ref cell
所以這些列表(如在原來的問題)真的會列出清單,例如'a = [[None]]'。 – Wyzard
這是一個簡單的索引調用。我有N維數組,我需要指向某個成員的指針,因爲索引不可用'現在'。這很難解釋,現在確實沒有關係。 – Necronomicron
問題已更新。 – Necronomicron
敷在
類>>> class A(object):
... pass
...
>>> a = [A()]
>>> a[0]
<__main__.A object at 0x1004ad850>
>>> a[0].x = 5
>>> a
[<__main__.A object at 0x1004ad850>]
>>> b = a[0]
>>> b.x
5
>>> b.x = 6
>>> a[0].x
6
是的,但數組是'a = [None]'。無論如何,在我的情況下包裝會使情況變得更糟。 – Necronomicron
仍然有效,將「無」包裝在類中。 – marcadian
這是我想聽到的。是的,這就是我現在所擁有的(帶lambda)。用指針我的代碼會更緊湊... – Necronomicron
@Necronomicron - 你做了lambdas?當我將使用lambda表達式的示例放在一起時,我意識到您不能在lambda表達式中進行賦值,因此我轉而使用「def」。 – DaoWen
對不起,lambda **和**函數。當然,我們不能在lambda中做任務。 :) – Necronomicron