是否可以获得列表成员的指针?

时间:2014-07-23 03:25:54

标签: python pointers python-3.4

我看到了一些相关的问题,我认为我的问题仍然没有答案。如何获得列表成员的指针(引用)?说,我有:

>>> a = [None]
>>> d = a[0]
>>> d = 3

我希望得到:

>>> a
[3] # But I get [None] of course.

在Python中有可能吗?或者我该如何实现呢?

更新

我的最终目标是更改来源

3 个答案:

答案 0 :(得分:2)

不,那是不可能的。您无法存储对列表中某个位置的引用,并尝试稍后通过分配进行更新。

如果要实现变通方法,则可能需要使用闭包来捕获列表中所需索引的引用。这是一个例子:

# 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

答案 1 :(得分:1)

使用ref单元格比使用指针更好。从python的角度来看,指针是一个遥远的概念。你可以从列表中创建一个便宜的ref单元格。

pointer = [3]
pointer[0] = 5 #change value of ref cell
pointer[0] #get value of ref cell

答案 2 :(得分:0)

将它包装在课堂上

>>> 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