Produits (itérateurs) tels que les cartes de Python3 ・ La notation d'inclusion du générateur entre parenthèses est jetable

Script Python en question (Python 3.5 pour Windows)

from sys import stderr
from copy import copy
N = 5
L1 = list(range(1,N + 1)) #[1,2,3,4,5]
print("L1 =", L1, file = stderr)
L2 = map(lambda i: i ** 2, L1)
L3 = map(lambda i: i ** 2, L1)
L4 = copy(L2)
L5 = [i ** 2 for i in L1]
L6 = list(map(lambda i: i ** 2, L1))
print("L2 =", list(L2)) #[1,4,9,16,25]
print("L2 =", list(L2)) #[1,4,9,16,25]Je pense ... ?? ??
print("L3 =", list(L3)) #[1,4,9,16,25]
print("L4 =", list(L4)) #[1,4,9,16,25]Je pense ... ?? ??
print("L5 =", list(L5)) #[1,4,9,16,25]
print("L5 =", list(L5)) #[1,4,9,16,25]
print("L6 =", list(L6)) #[1,4,9,16,25]
print("L6 =", list(L6)) #[1,4,9,16,25]
print("L1 =", L1)

Résultat d'exécution

L1 = [1, 2, 3, 4, 5]
L2 = [1, 4, 9, 16, 25]
L2 = []
L3 = [1, 4, 9, 16, 25]
L4 = []
L5 = [1, 4, 9, 16, 25]
L5 = [1, 4, 9, 16, 25]
L6 = [1, 4, 9, 16, 25]
L6 = [1, 4, 9, 16, 25]
L1 = [1, 2, 3, 4, 5]

Ce que j'ai appris à partir de maintenant

Ce que vous pouvez voir, c'est que l'accès à l'objet créé par ** map n'est valide qu'une seule fois ** (L2 L3). ** De plus, il était inutile de faire une copie superficielle («L4») avec «copy.copy». ** Utilisez la notation d'inclusion de liste ** lors de l'accès plusieurs fois (L5, mais ** en dehors des crochets **) ou ** instantanément liste ou taple ** ( L6) Devrait être. ** Lorsque vous devez afficher le contenu d'un objet de carte dans le débogage, vous pouvez être accro à un bogue inexpliqué en raison de ces caractéristiques uniquement lors du débogage. ** **

Comme indiqué dans la section commentaires, ** Si le générateur est inclus entre parenthèses, il sera jetable comme map. ** **

Comment utiliser la carte

Fondamentalement, vous pouvez éviter des situations comme L2 et L4 en ne faisant un accès qu'une seule fois après la génération (y compris la liste ou en tapant comme L6).

À propos des autres objets

range, zip, etc. généreront des objets similaires, mais ils peuvent également être jetables . </ del>. Soyez prudent lorsque vous accédez plusieurs fois (à partir du commentaire).

Recommended Posts

Produits (itérateurs) tels que les cartes de Python3 ・ La notation d'inclusion du générateur entre parenthèses est jetable
Utilisez le tissu tel quel en python (fabric3)
Modules de fonctions fréquemment utilisées en Python (comme la lecture de fichiers externes)
Mémorandum des débutants en python
Utilisez Python pour une sortie formatée telle que C / C ++ printf