-1
votes

Python: modifier l'argument sans créer un nouvel objet

Je veux jeux pour mettre à jour lorsque check () est appelé, mais dès que `jeux + = 1`` fonctionne, il crée un nouvel objet (un python quirk) plutôt que de modifier l'argument. Mais je veux modifier l'argument, alors comment puis-je faire cela?

maintenant gagne et jeux réinitialiser à 0 après chèque () renvoie < PRE> XXX

J'ai été capable de trouver des trucs sur pourquoi Python crée un nouvel objet, mais pas un moyen propre de l'empêcher.


14 commentaires

jeux intérieur vérifier est une variable locale et il n'a rien à voir avec une variable externe jeux - ils ont le même nom mais pour Python il y a deux variables.


Veuillez jeter un oeil à MRE . Je vous suggère de revenir votre dernier édition ou de supprimer les variables non définies et ... de celui-ci.


Si vous souhaitez modifier la fonction à l'intérieur de la fonction, retournez une nouvelle valeur - jeux = check (jeux) ou éventuellement utiliser des variables globales. Vous pouvez également conserver ces valeurs dans le dictionnaire config = {"jeux": 1} et envoyer le dictionnaire vers la fonction - check (config) et il changera de valeur en externe / global Dictionnaire si vous utilisez config ["jeux"] + = 1 fonction intérieure


Ok, c'est bizarre. Je ne trouve pas l'histoire de l'édition, mais je jure que j'ai vu 2 modifications différentes sur cette question.


Pourquoi retournez-vous 1 ou 0 au lieu des nouvelles valeurs? Sont-ils censés être des codes d'erreur? Si tel est le cas, vous devriez envisager de changer votre architecture - vous semblez combattre la langue en écrivant du code adapté à quelque chose comme C.


Dans certains mon commentaire, je vois "encapsulation orientée objet". Créez-vous des cours? Ensuite, vous pouvez utiliser auto. pour résoudre les problèmes.


@Mistermiyagi Je veux seulement changer de joueur si le jeu s'est terminé. Choix (...) Vérification du jeu final et retourne si le joueur doit être modifié.


Donc, la première modification que j'ai vue doit avoir été une 2e version qui a été revenue ...


@furas Dans ce cas, je n'utilise pas de cours, donc auto ne fonctionnera pas. Je dis «encapsulation» parce que je sépare toujours les processus par leur but. Je suppose que cet exemple est moins orienté objet


@Luther La première version de la question incluait le code non liée à ce qui était vraiment demandé, alors je l'ai simplement poussé.


En règle générale, le code dans la question devrait être exécutable afin que nous puissions la copier-coller et travailler avec elle dans notre éditeur.


Ce n'est pas un "bizarrerie"; int s sont immuables


@cheppner à Python, sûr, mais toutes les mêmes langues n'utilisent pas les mêmes mécanismes de scopage. Peut-être que «rapide» est un peu fort puisqu'il s'agit d'une caractéristique commune, mais d'un choix de conception linguistique néanmoins.


En fait, le mécanicien de cadrage en question ici est assez universel. Une fonction ne peut pas attribuer aux variables d'argumentation, car un argument peut être une expression, pas seulement une variable.


4 Réponses :


0
votes

Je ne suis pas de python-expert, mais je crois que Python a des types immuables et mutables. Les types immuables, lorsqu'ils sont modifiés dans une fonction, créeront une nouvelle instance de l'objet. Les types immuables sont des cordes, des tuples et des chiffres. Dans votre cas, jeux est un type immuable (numéro).

Voir: Valeurs de passage à Python

Comment contourner le nouvel objet-création d'un type immuable, je ne sais pas. Les solutions les plus évidentes à votre problème sont, utilisez une variable globale ou renvoyez le nouvel objet de jeux.


1 commentaires

Merci, ce serait vraiment utile. Lors du retour des objets est une option, il allait casser l'encapsulation orientée objet.



2
votes

Ceci est possible en double de Variables de passage par référence . Je vous recommande de passer à travers cette question.

aussi Python vous permet de retourner plusieurs valeurs. Vous pouvez faire xxx

ou xxx

en faisant cela, vous obtenez un tuple avec deux éléments renvoyés de la fonction. Donc, vous ne pourrez pas l'utiliser directement dans une déclaration IF. Vous pouvez stocker les deux valeurs, puis comparer en si instruction.


0 commentaires

1
votes

Le moyen le plus propre de le faire consisterait simplement à renvoyer les informations dont vous avez besoin à partir de la fonction cocher : xxx

Si vous avez vraiment besoin d'aller à la route de l'OOP , vous pouvez transmettre un objet à vérifier de sorte que la fonction puisse la modifier autant qu'il doit: xxx

une solution 3ème serait à utiliser Variables globales, mais je ne le recommande vraiment pas. Ils peuvent être un vrai désordre.


0 commentaires

1
votes

nombre est des types imutables. Et les jeux sont une copie pour les jeux d'arguments dans le Funcion. Donc, vous ne pouvez pas le changer.

Si vous voulez le changer, vous pouvez le mettre en variole mutable par exemple la liste, le dictionnaire.Tren, vous pouvez le modifier dans la fonction.


0 commentaires