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

不言
Libérer: 2018-10-08 16:29:24
avant
3046 Les gens l'ont consulté

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))
Copier après la connexion

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
Copier après la connexion

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]
Copier après la connexion

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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal