Je veux maintenant 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. p> p> jeux code> pour mettre à jour lorsque
check () code> 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?
gagne code> et
jeux code> réinitialiser à 0 après chèque () renvoie p> < PRE> XXX PRE>
4 Réponses :
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, 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. P> jeux code> est un type immuable (numéro). P>
Merci, ce serait vraiment utile. Lors du retour des objets est une option, il allait casser l'encapsulation orientée objet.
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 p> ou p> 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. P> p>
Le moyen le plus propre de le faire consisterait simplement à renvoyer les informations dont vous avez besoin à partir de la fonction code> cocher code>: Si vous avez vraiment besoin d'aller à la route de l'OOP , vous pouvez transmettre un objet à une solution 3ème serait à utiliser Variables globales, mais je ne le recommande vraiment pas. Ils peuvent être un vrai désordre. P> p> vérifier code> de sorte que la fonction puisse la modifier autant qu'il doit: p>
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. P>
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. P>
jeux code> intérieur
vérifier code> est une variable locale et il n'a rien à voir avec une variable externe
jeux code> - 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
... code> de celui-ci.
Si vous souhaitez modifier la fonction à l'intérieur de la fonction, retournez une nouvelle valeur -
jeux = check (jeux) code> ou éventuellement utiliser des variables globales. Vous pouvez également conserver ces valeurs dans le dictionnaire
config = {"jeux": 1} code> et envoyer le dictionnaire vers la fonction -
check (config) code> et il changera de valeur en externe / global Dictionnaire si vous utilisez
config ["jeux"] + = 1 code> 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. Code> pour résoudre les problèmes.
@Mistermiyagi Je veux seulement changer de joueur si le jeu s'est terminé.
Choix (...) CODE> 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 code> 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 code> 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.