8
votes

Comment utiliser la variable locale dans une fonction et le renvoyer?

J'essaie de créer un script qui définit une variable locale, la référente à partir d'une fonction et peut renvoyer la valeur manipulée à la portée principale (ou quoi que ce soit appelé; je suis nouveau à Python)

i J'ai simplifié mon code pour montrer les bases optimistes de ce que j'essaye d'accomplir, ce qui consiste à importer un local à partir du module dans un bloc de fonction, je pense. p>

J'ai eu ceci pour travailler en utilisant Globals Code>, mais ce n'est pas la meilleure solution. . . P>

chambersinreactor = 0;
cardsdiscarded = 0;

def find_chamber_discard(): 
    """Find chambers and discard in row (reads each player slot)"""
    chambersinreactor = 0; # Resets the variable, not what I want
    cardsdiscarded = 0; # Resets the variable, not what I want
    chambersinreactor += 1
    cardsdiscarded += 1
    return # Don't know what to put here

find_chamber_discard()

print chambersinreactor # prints as 0, should be 1
print cardsdiscarded    # prints as 0, should be 1


2 commentaires

Voulez-vous dire que vous voulez transmettre des arguments sur la fonction, puis les renvoyer?


Chambersinreactor et `cartesDiscarded` sont des variables globales. Ils sont définis en dehors de la portée locale.


3 Réponses :


21
votes

Les fonctions ne devraient pas avoir à savoir quelle portée ils s'appellent; Le point d'une fonction consiste à effectuer un bloc de code réutilisable qui peut être invoqué plusieurs fois à différents endroits.

Vous communiquez des informations à une fonction en passant à travers ses variables d'entrée. La fonction communique les informations à son appelant en le renvoyant.

Gérer les variables d'une portée est le travail du code dans cette portée non toutes les fonctions qu'elle invoque. Si vous devez définir des variables sur des valeurs déterminées par une fonction, vous avez la fonction renvoyer ces valeurs et vous les utilisez pour définir les variables. Si les valeurs de la fonction calculent dépendent des valeurs des variables que vous avez dans la portée de l'appel, vous devez les transmettre à la fonction comme arguments. La fonction que vous appelez ne devrait pas avoir à savoir quelles variables utilisées et ne devriez pas être capable de gâcher avec eux.

Mettre cela ensemble, ce que vous voulez faire est quelque chose comme ceci: xxx

Il existe des moyens de contourner cela avec des variables globales ou de manipuler des structures de données mutables, mais en fin de compte, ils rendent votre programme moins flexible et plus susceptibles de contenir des erreurs qui seront difficile à repérer. Il existe une place pour ces techniques, mais la première méthode que vous touchez pour communiquer des informations vers et depuis des fonctions devraient vraiment transmettre des arguments et recevoir des valeurs de retour.


1 commentaires

Chambersinreactor, CartesDiscarded = Find_chamber_Discard (Chambersinreactor, cartesDiscarded) - C'est incroyable - qui savait que vous pouviez renvoyer plusieurs valeurs comme celle-ci ?!



2
votes
#!/usr/bin/env python
chambersinreactor = 0; cardsdiscarded = 0;

def find_chamber_discard():
    chambersinreactor = 0
    cardsdiscarded = 0
    chambersinreactor += 1 
    cardsdiscarded += 1 
    return(chambersinreactor, cardsdiscarded)

#Here the globals remain unchanged by the locals.
#In python, a scope is similar to a 'namespace'
find_chamber_discard()

print chambersinreactor #prints as 0
print cardsdiscarded 

#I've modified the function to return a pair (tuple) of numbers.
#Above I ignored them. Now I'm going to assign the variables in the 
#main name space to the result of the function call.
print("=====with assignment===")
(chambersinreactor, cardsdiscarded) = find_chamber_discard()

print chambersinreactor #  now prints as 1
print cardsdiscarded 

# Here is another way that doesn't depend on returning values.
#Pass a dictionary of all the main variables into your function
#and directly access them from within the function as needed

print("=======using locals===")
def find_chamber_discard2(_locals):
    _locals['chambersinreactor'] += 1
    _locals['cardsdiscarded'] += 1
    return

find_chamber_discard2(locals())

print chambersinreactor #incremented the value, which was already 1
print cardsdiscarded 

1 commentaires

La recommandation de la DOCS est de jamais Modifier les sections locales (), car le comportement que vous noter est entièrement basé sur la mise en œuvre et n'est pas garanti: "Le contenu de ce dictionnaire ne doit pas être modifié; changements peut ne pas affecter les valeurs des variables locales et libres utilisées par l'interprète. "



2
votes

Une approche consiste à utiliser des valeurs mutables, telles que les dictes ou les listes: xxx

Toutefois, si vous avez une fonction qui change de l'état, vous êtes probablement mieux en train de s'enraciner. En classe, comme c'est ce qu'elles sont: xxx

Si ce que vous faites est compte, vous pouvez peut-être utiliser le compteur: xxx < / Pré>

Personnellement, j'irais pour l'approche de la classe, peut-être même en emballage de comptoir, car elle maintient toutes les fonctionnalités associées ensemble.


0 commentaires