web-dev-qa-db-fra.com

syntax-error: impossible d'affecter à l'opérateur

def RandomString (length,distribution):
    string = ""
    for t in distribution:
        ((t[1])/length) * t[1] += string
    return shuffle (string)

Cela retourne une erreur de syntaxe comme décrit dans le titre. Dans cet exemple, distribution est une liste de n-uplets, chaque n-uplet contenant une lettre et sa distribution, toutes les distributions de la liste totalisant 100, par exemple:

[("a",50),("b",20),("c",30)] 

Et length est la longueur de la chaîne souhaitée.

6
TheFoxx

Python est contrarié parce que vous essayez d'attribuer une valeur à quelque chose à laquelle une valeur ne peut pas être affectée.

((t[1])/length) * t[1] += string

Lorsque vous utilisez un opérateur d'affectation, vous affectez la valeur de ce qui se trouve à droite à la variable ou à l'élément de gauche. Dans votre cas, il n'y a pas de variable ou d'élément à gauche, mais une valeur interprétée: vous essayez d'affecter une valeur à quelque chose qui n'est pas un "conteneur".

En vous basant sur ce que vous avez écrit, vous ne comprenez pas comment cet opérateur fonctionne. Changez juste vos opérandes, comme ça.

string += str(((t[1])/length) * t[1])

Notez que j'ai encapsulé la valeur affectée dans str afin de la convertir en str afin qu'elle soit compatible avec la variable string à laquelle elle est affectée. (Les chiffres et les chaînes ne peuvent pas être additionnés.)

9
cheeken

Eh bien, comme le dit l'erreur, vous avez une expression (((t[1])/length) * t[1]) sur le côté gauche de l'affectation, plutôt qu'un nom de variable. Vous avez cette expression, puis vous dites à Python d’ajouter string (qui est toujours "") et de l’assigner à ... où? ((t[1])/length) * t[1] n'est pas un nom de variable, vous ne pouvez donc pas y stocker le résultat.

Voulez-vous dire string += ((t[1])/length) * t[1]? Cela aurait plus de sens. Bien sûr, vous essayez toujours d'ajouter un nombre à une chaîne, ou de la multiplier par une chaîne ... un de ces t[1]s devrait probablement être un t[0].

1
kindall

Au lieu de ((t[1])/length) * t[1] += string, vous devriez utiliser string += ((t[1])/length) * t[1]. (L’autre problème de syntaxe - int is not iterable - sera votre exercice à résoudre.)

0
Makoto