2009-12-09 5 views
3

La ligne suivante ne semble pas fonctionner:Pas possible de faire (a, b) + = (1, 2) en python?

(count, total) += self._GetNumberOfNonZeroActions((state[0] + x, state[1] - ring, state[2])) 

Je suppose qu'il est impossible d'utiliser l'opérateur + = dans ce cas. Je me demande pourquoi?

edit: En fait ce que je veux c'est ajouter au nombre de variables et totaliser les valeurs données par le tuple retourné par cette fonction. Maintenant que j'y pense, cela n'a pas de sens d'autoriser (a, b) + = (1, 2), car cela créerait un nouveau tuple, n'est-ce pas? En d'autres termes, y a-t-il un moyen de simplifier cela?

res = self._GetNumberOfNonZeroActions((state[0] + x, state[1] + ring, state[2])) 
    count, total = res[0], res[1] 
+0

Après avoir lu vos commentaires en réponse à des réponses, et relisant maintenant votre question, je suis très confus au sujet de votre objectif réel. Votre explication n'inclut pas de boucle, êtes-vous en boucle sur différents états et accumulez-vous? Ou voulez-vous juste un déballage de tuple? Votre "En d'autres termes" semble vouloir juste décompresser le tuple, ce qui pourrait être réalisé en remplaçant le '+ =' dans votre ligne d'origine par '='. Boucler sur + = avec les tuples créera un tuple plus long et plus long. –

+0

Je veux réaliser quelque chose comme l'addition de points, c'est (a, b) = (a, b) + (x, y) = (a + x, b + y). –

+0

Dans ce cas, votre question est fondamentalement la même que http://stackoverflow.com/questions/497885/python-tuple-operations, la solution stupide il y a peut-être moins d'effort que de dépendre de numpy. –

Répondre

1

Si vous voulez travailler sur des tableaux numériques, je recommande d'utiliser numpy http://numpy.scipy.org/.

Il vous permet de le faire:

>>> from numpy import * 
>>> count_total = array((0,0)) 
>>> count_total += (1,2) 
>>> count_total 
array([1, 2]) 
5

Vous mélangez deux concepts ensemble. Python prend en charge tuple unpacking qui vous permet de attribuer plus d'une variable dans une seule ligne.

L'opérateur += est agrandi par l'interpréteur puisqu'il ne s'agit que d'un raccourci. Votre exemple ((a, b) += (1, 2)) serait étendu à ceci:

(a, b) = (a, b) + (1, 2) 

qui, quand vous regardez, ne fait pas beaucoup de sens. Rappelez-vous simplement que le déballage de tuple ne fonctionne que pour l'affectation de valeurs à des variables.

+0

Oui, vous avez raison. Mais mon premier exemple avec (compte, total) aurait du sens. –

10

Votre observation est exacte: a += b pour tout a et b signifie la même chose que a = a + b (sauf qu'il peut enregistrer une évaluation de a). Donc, si a est un tuple, la seule chose qui peut être += est un autre tuple; si a est un tuple temporaire sans nom, cela signifie que += sera bien entendu non observable - Python vous aide en attrapant ce cas particulier en tant qu'erreur de syntaxe. Vous devez donner un nom tuple (ou toute autre référence réaffectable) avant + = à elle ...:

>>> thetup = (a, b) 
>>> thetup += (1, 2) 
>>> thetup 
(23, 45, 1, 2) 

si la syntaxe (a, b) += (1, 2) a été acceptée, il devrait évidemment impliquer les mêmes fonctionnalités .. mais sans aucun moyen observable possible de vérifier que l'ajout avait effectivement eu lieu, ce qui n'a vraiment aucun sens. Heureusement que la syntaxe n'est pas acceptée, donc! -)

+0

+1 Bien expliqué :) –

+0

C'était tout. J'utilise data = (0,0) et data + = ... et ça marche. Merci! –

Questions connexes