Obtener un puntero a un elemento de lista

Me preguntaba si era posible obtener un “puntero” a un elemento en una lista de python. De esa manera, podría acceder a mi elemento directamente sin necesidad de conocer el índice de mi elemento. Lo que quiero decir con eso es que en una lista, puede agregar elementos en cualquier lugar; al principio, en el medio o incluso al final, sin embargo, los elementos individuales no se mueven de su ubicación de memoria real. En teoría, debería ser posible hacer algo como:

myList = [1]

[1]

element = &myList[0]

El elemento actuaría como un puntero aquí.

     myList.insert(0, 0) myList.append(2) 

    [0, 1, 2]

    En este punto, todavía podría tener acceso al elemento directamente aunque su índice dentro de la lista haya cambiado.

    La razón por la que quiero hacer esto es porque en mi progtwig, sería demasiado tedioso hacer un seguimiento de cada elemento que agrego a mi lista. Cada elemento es generado por un objeto. De vez en cuando, el objeto tiene que actualizar el valor, pero no se puede garantizar que encontrará su artículo en el mismo índice que cuando se agregó. Tener un puntero resolvería el problema. Espero que tenga sentido.

    ¿Cuál sería la forma correcta de hacer algo así en Python?

    No hay ningún concepto de punteros en python (al menos que yo sepa).

    En caso de que esté guardando objetos dentro de su lista, simplemente puede mantener una referencia a ese objeto.

    En el caso de que esté guardando valores primitivos en su lista, el enfoque que tomaría es hacer un objeto envolvente alrededor del valor / valores y mantener una referencia de ese objeto para usarlo más tarde sin tener que acceder a la lista. De esta manera, su envoltura funciona como un objeto mutable y se puede modificar sin importar desde dónde lo acceda.

    Un ejemplo:

     class FooWrapper(object): def __init__(self, value): self.value = value # save an object into a list l = [] obj = FooWrapper(5) l.append(obj) # add another object, so the initial object is shifted l.insert(0, FooWrapper(1)) # change the value of the initial object obj.value = 3 print l[1].value # prints 3 since it's still the same reference 

    element = mylist[0] ya funciona si no necesita cambiar el elemento o si element es un objeto mutable.

    Los objetos inmutables, como los objetos int en Python, no se pueden cambiar. Además, puede referirse al mismo objeto usando varios nombres en Python, por ejemplo, sys.getrefcount(1) es ~ 2000 en un REPL nuevo en mi sistema. Naturalmente, no quieres que 1 signifique 2 de repente en todos estos lugares.

    Si desea cambiar un objeto más adelante, entonces debería ser mutable, por ejemplo, si mylist[0] == [1] luego para cambiar el valor, puede configurar el element[0] = 2 . Un objeto personalizado en lugar de la lista [1] podría ser más apropiado para una aplicación específica.

    Como alternativa, puede usar un diccionario (u otros objetos de espacio de nombres, como los types.SimpleNamespace nombres types.SimpleNamespace ) en lugar de la lista de mylist . Luego, para cambiar el elemento, mydict["a"] = 2 referencia por su nombre: mydict["a"] = 2 .