Maison  >  Article  >  développement back-end  >  Une brève introduction à l'affectation incrémentielle de séquence en Python (avec des exemples)

Une brève introduction à l'affectation incrémentielle de séquence en Python (avec des exemples)

不言
不言avant
2018-10-08 16:29:243018parcourir

Cet article vous apporte une brève introduction à l'affectation incrémentielle de séquence en Python (avec des exemples). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Les opérateurs d'affectation incrémentielle sont += et *=. La méthode spéciale derrière += est __iadd__ Si une classe n'implémente pas la méthode __iadd__, Python prendra du recul et l'appellera. Méthode __add__. La différence entre ces deux méthodes est que __iadd__ est un changement sur place et ne modifiera pas l'adresse mémoire de la valeur d'origine, tandis que la méthode __add__ obtiendra un nouvel objet.

Considérez l'expression suivante :

a += b

Si a implémente la méthode __iadd__, a sera modifié sur place (l'adresse mémoire reste inchangée). Si a n'implémente pas la méthode __iadd__, alors l'effet de l'expression a += b devient le même que a = a + b, générant un nouvel objet et l'attribuant à a.

De manière générale, les séquences mutables implémentent généralement la méthode __iadd__, donc += est un ajout sur place, alors que les séquences immuables ne prennent pas du tout en charge cette opération.

*= est identique à +=, sauf que la méthode spéciale derrière est __imul__.

a = [1, 2, 3]
b = [4, 5, 6]print("id(a) = %d" % id(a))
a += bprint("id(a) = %d" % id(a))

c = [1, 2, 3]print("id(c) = %d" % id(c))
c = c + bprint("id(c) = %d" % id(c))

d = (1, 2, 3)print("id(d) = %d" % id(d))
d *= 2print("id(d) = %d" % id(d))

Les résultats en cours d'exécution sont les suivants :

id(a) = 1298277978824
id(a) = 1298277978824
id(c) = 1298277978696
id(c) = 1298277978632
id(d) = 1298277972872
id(d) = 1298277136616

Compréhension la séquence Affectation incrémentale, regardons le puzzle évoqué par Leonardo Rochael lors de la Python Brazil Conference en 2013 :

t = (1, 2, [30, 40])
t[2] += [50, 60]

A.  t devient ( 1, 2, [30, 40, 50, 60])

B. Étant donné que le tuple ne prend pas en charge l'affectation à ses éléments, une exception TypeError sera levée

C les deux No<.>

D. A et B sont corrects

Je suppose que beaucoup de gens choisiront B comme moi, mais en fait la réponse est D. Exécutez le code sur la console et les résultats sont les suivants :

Résumé :

1. sur les séquences immuables, l'efficacité sera très faible, car à chaque fois vous devrez créer une nouvelle séquence, puis copier les éléments de la séquence d'origine dans la nouvelle séquence, puis ajouter de nouveaux éléments.

2. Ne mettez pas d’objets mutables dans des tuples.

3. L'affectation incrémentielle n'est pas une opération atomique. Nous venons de voir que même si elle lève une exception, la valeur de t change toujours.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer

Articles Liés

Voir plus