[Désolé, je suis nouveau à Python. Bien que cela semble être une question très fondamentale, j'ai fait ma part de diligence raisonnable avant de demander à ce public, essayant d'éviter des questions vraiment stupides].
J'essaie de comprendre l'idiome correct pour le retour d'une valeur L de une fonction. Supposons que j'ai un conteneur de 64 objets et je souhaite pouvoir renvoyer une référence à ces objets. P>
board = ChessBoard() board.square(0,0) = Piece( Shapes.ROOK, Colors.White ) <-- I'm getting an error here board.square(0,1) = Piece( Shapes.BISHOP, Colors.White ) ... etc.
4 Réponses :
en python, tout em> est une référence. Le seul problème est que Vous ne pouvez pas non plus remplacer l'opérateur d'affectation, Donc, vous ne recevrez pas ce genre de comportement particulier. Cependant, une bonne et très flexible solution serait de remplacer le utilisation: p> Aucun code> est immuable em>, vous ne pouvez donc pas utiliser la référence renvoyée pour modifier la valeur.
__ Settitem __ Code>
et __ getItem __ code>
Méthodes pour implémenter l'opérateur d'abonnement ( [] code>) pour la classe: p>
Notez que la définition est légèrement plus laide dans 3.x, car le cas particulier du déballage du tuple dans les listes d'argumentation s'est allé la voie du bleu norvégien. Vous devriez définir def __setem __ (Self, Row_Col, Valeur): Rangée, Col = Row_Col; Self.Squares [rangée * 8 + col] = valeur code>.
@Delnan: Merci, je l'ai changé parce que le reste est la version-agnostique. Je pense que le choix de supprimer cette fonctionnalité est malheureux, il peut être vraiment utile s'il est utilisé sensiblement.
Comme le souligne Niklas, vous ne pouvez pas retourner une valeur L. P>
Toutefois, en plus de souscription de remplacement, vous pouvez également utiliser Propriétés ( Une application de descripteurs: http://docs.python.org/howto/descriptor.htmlleight/a >) Pour créer un attribut d'objet, lequel lorsque vous lisez ou attribué à, exécute le code. P>
Cela ne résout pas ce problème particulier, cependant, car il n'y a pas de paramètre d'attribut pour intercepter ici. Il pourrait toutefois être utilisé pour activer quelque chose comme board.square (0,0) .value = pièce (...) code>.
Pas vrai. J'ai trouvé un moyen d'utiliser des globaux () et des locaux (). Voir Ici
@Logan vrai. Vous n'avez pas trouvé de moyen de retourner une lvalue, vous avez trouvé un moyen de définir une valeur dans le dictionnaire local / globals.
(Ne répondant pas à votre question dans le titre, mais votre «Comment approcheriez-vous cette structure de données?» Question :) Une solution plus pythonique pour votre structure de données utiliserait une liste de listes:
# define a function that generates an empty chess board make_chess_board = lambda : [[None for x in xrange(8)] for y in xrange(8)] # grab an instance b = make_chess_board() # play the game! b[0][0] = Piece(Shapes.ROOK, Colors.White) b[0][1] = Piece(Shapes.BISHOP, Colors.White) # Or use tuples: b[0][0] = (Shapes.ROOK, Colors.White) b[0][1] = (Shapes.BISHOP, Colors.White)
Vous pouvez essayer quelque chose comme ceci, au prix d'avoir à mettre de bogus [:] indexeurs autour de: alors vous pouvez faire p> et ainsi de suite. Cela ne comporte pas ce que vous mettez dans la [] s, il doit simplement être quelque chose. P> (obtenu l'idée des proxies Perl6 utilise pour le faire) p> p>
Pouvez-vous s'il vous plaît poster la source d'où vous avez eu cette idée?