La simulation de Pointeurs en Python
Je suis en train de faire de la compilation croisée dans la maison de la langue(dih) de Python.
L'un des dih caractéristiques est les pointeurs et les références qui se comportent comme vous vous attendez de C ou de C++.
Par exemple, vous pouvez faire ceci:
a = [1,2]; // a has an array
b = &a; // b points to a
*b = 2; // derefernce b to store 2 in a
print(a); // outputs 2
print(*b); // outputs 2
Est-il un moyen de reproduire cette fonctionnalité en Python.
Je tiens à souligner que je crois que j'ai confondu un peu de gens. Je ne veux pas de pointeurs en Python. Je voulais juste avoir une idée de l'Python experts, ce Python je devrait générer pour simuler le cas, je l'ai montré ci-dessus
Mon Python n'est pas la plus grande, mais jusqu'à présent, mon exploration n'a pas abouti à quelque chose de prometteur:(
Je tiens à souligner que nous sommes à la recherche à passer de nos dih plus courante de la langue, donc nous ne sommes pas vraiment lié à Python si quelqu'un peut suggérer une autre langue qui peut être plus approprié.
- Si vous essayez de compiler un assez faible niveau de langue à un assez haut niveau? Avez-vous envisagé d'autres plates-formes pour votre VM à la place?
- cluecc.sourceforge.net compile C à divers niveau élevé de langues, mais qui n'ont pas un backend Python encore. Il serait intéressant de voir comment il se comporte, bien 🙂
- Un problème avec votre exemple est que vous êtes en utilisant des entiers, ce qui en Python est immuable. I. e, vous ne pouvez pas les modifier. Ceci, combiné avec le fait que vous avez une variable de tableau, qui vous le remplacer par un entier dans votre code C (qui est horrible à partir d'un C, point de vue) signifie que vous êtes demandé un moyen de la mauvaise utilisation de Python dans une manière similaire à la façon dont vous l'abus C. Qui n'a tout simplement pas de sens.
- Regbro. La langue que je veux en venir n'est-ce pas C. je pensais que j'avais fait clair pour vous maintenant:)
- Utiliser la taille-1 listes pour mutable références et non-const pointeurs:
a=[smth]
b=[a]
b[0][0] = 2
print a[0]
print b[0][0]
- Pourquoi ne pas
b=a
? Écritb=[a]
semble exagéré depuisa
déjà est en fait un pointeur verssmth
.
Vous devez vous connecter pour publier un commentaire.
Cela peut être fait de manière explicite.
'a ref
, mais oui, il serait préférable de choisir un plus nom unique. Pas sûr queptr
fait beaucoup de sens; il n'est en fait pas un pointeur, c'est plus comme un seul conteneur...__call__
pour mettre en œuvre l'obtention et la configuration, ce qui est plus semblable à la façon dont un weakref se comporte.i = i + 1
,i
sera point à un nouvel objet.Vous voudrez peut-être lire la Sémantique de Python, les noms de variables à partir d'un C++ perspective. La ligne du bas: Toutes les variables sont des références.
Plus au point, ne pas penser en termes de variables, mais en termes d'objets qui peuvent être nommé.
Si vous êtes à la compilation d'un C-comme la langue, de dire:
en Python, puis tous les "tout en Python est une référence" choses " est un abus de langage.
C'est vrai que tout en Python est une référence, mais le fait que de nombreux types de base (entiers, chaînes de caractères) sont immuables efficacement annule cette pour de nombreux cas. Il n'y a pas direct façon de mettre en œuvre le ci-dessus en Python.
Maintenant, vous pouvez le faire indirectement: pour toute immuable du type, de l'envelopper dans un mutable type. Ephemient la solution fonctionne, mais souvent, je viens de le faire:
(Je l'ai fait ce travail autour de Python est le manque de "non" dans le 2.x quelques fois.)
Cela implique beaucoup plus généraux: chaque immuable type (ou de chaque type, si vous n'essayez pas de les distinguer) soudain crée une liste (ou un autre objet conteneur), de sorte que vous êtes à l'augmentation de la surcharge pour les variables de manière significative. Individuellement, il n'est pas beaucoup, mais il va ajouter jusqu'à quand appliqué à l'ensemble de la base de code.
Vous pouvez réduire ce en seulement emballage immuable types, mais alors vous aurez besoin de garder une trace des variables de sortie sont enveloppés et qui ne le sont pas, de sorte que vous pouvez accéder à la valeur de "a" ou "a[0]" de manière appropriée. Il va probablement s'arracher les cheveux.
De savoir si c'est une bonne idée ou pas-qui dépend de pourquoi vous le faites. Si vous voulez juste quelque chose pour exécuter une machine virtuelle, j'aurais tendance à dire non. Si vous voulez être en mesure d'appeler à votre langue à partir de Python, je vous suggère de prendre votre VM existantes et la création de liaisons Python pour elle, de sorte que vous pouvez accéder et de les appeler à partir de Python.
ref
est fondamentalement la dégénérée 1-l'élément seul cas delist
. 1-tuple
serait moindre frais généraux, mais, malheureusement, ceux qui ne sont pas mutables.Presque exactement comme ephemient réponse, qui j'ai voté, vous pouvez utiliser Python builtin propriété fonction. Il va faire quelque chose près semblable à la
ref
classe dans ephemient réponse, sauf que maintenant, au lieu d'être forcé à utiliserget
etset
méthodes pour accéder à unref
exemple, vous venez d'appeler les attributs de votre instance à laquelle vous avez assigné comme propriétés dans la définition de classe. À partir de Python docs (sauf que j'ai changé C à ptr):Les deux méthodes fonctionnent comme un C pointeur, sans avoir recours à
global
. Par exemple, si vous avez une fonction qui prend un pointeur:Par exemple
Un autre, et totalement fou option serait d'utiliser Python ctypes. Essayez ceci:
ou si vous voulez vraiment faire de la fantaisie
qui est plus proche de l'OP de la demande d'origine. fou!
Comme d'autres ici l'ont dit, tous les Python variables sont essentiellement des pointeurs.
La clé pour comprendre le présent à partir d'un C point de vue est d'utiliser l'inconnu par beaucoup de fonction id (). Il vous indique ce que l'adresse de la variable de points.
Tout en Python est des pointeurs déjà, mais il est appelé "références" en Python. C'est la traduction de votre code Python:
"Déréférencement" n'a aucun sens, que c'est tous références. Il n'y a pas autre chose, donc, rien à déréférencer à.
C'est maladroit, mais une pensée...
Mais il n'y aurait pas de l'arithmétique des pointeurs ou tel, et ne sait pas quels sont les autres problèmes que vous pourriez rencontrer...
b
dans d'autres fonctions de cette façon.Je pense que cet exemple est court et clair.
Ici, nous avons la classe avec implicite liste:
En regardant ce profil de la mémoire (à l'aide de:
from memory_profiler import profile
), mon intuition me dit que cela peut en quelque sorte simuler des pointeurs comme dans C:Et ici, nous avons explicite de soi dans la classe:
ps: je suis en auto-apprentissage de la programmation (commencé avec Python) donc merci de ne pas me détester si je me trompe. Son vient de la mine de l'intuition, que, permettez-moi de penser de cette façon, donc, ne me détestez pas!
Négatif, pas de pointeurs. Vous ne devez pas avec la manière dont le langage est conçu. Cependant, j'ai entendu une méchante rumeur que vous pourrait utiliser le: ctypes module à utiliser. Je ne l'ai pas utilisé, mais il sent salissant pour moi.