Pourquoi la variable de boucle n'est pas mise à jour en python

Ce code est seulement l'impression 1 2 4 5..Mon question est que pourquoi p n'est pas mis à jour avec le nouveau tableau à 3ème itération

p = [1, 2, [1, 2, 3], 4, 5]
for each in p:
  if type(each) == int:
    print each
  else:
    p = each

En fait, pour être précis lors du débogage, le code j'ai vu qu'il mettait à jour la valeur de p mais chaque variable n'est pas réinitialisé à nouveau.

0
Cela ne change pas; sa référence est juste réaffectée.
ajouté l'auteur TigerhawkT3, source

2 Réponses

En raison de si tapez (each) == int: ligne. Votre troisième élément est une liste ( [1, 2, 3] ) et non un int, donc il n'imprime rien.

Maintenant, que devient la modification de la variable p : p est juste un nom pour un objet, pas l'objet lui-même. Si vous faites p = each dans la boucle for, cela n'affecte pas l'objet d'origine que vous parcourez, il change juste le nom p en local , qui pointe vers un objet différent. Dès que ce tour de la boucle se termine, votre boucle for continue à faire son affaire avec l'objet d'origine que vous étiez en boucle.

Donc, notez que p = each ne change pas l'objet existant (le p que vous parcourez), il crée simplement un nouveau nom local p qui pointe sur la valeur de chaque .


Ce que vous voulez le plus, c'est quelque chose comme ça:

p = [1, 2, [1, 2, 3], 4, 5]
for each in p:
    if isinstance(each, list):
        for x in each:
            print x
    else:
        print each

Ceci encore une fois, ce n'est pas récursif, et vous auriez besoin d'une fonction pour cela:

def print_elements(iterable):
    for element in iterable:
        if isinstance(element, list):
            print_elements(element)
        else:
            print element

Si vous voulez décompresser les valeurs dans une liste pour les utiliser pour autre chose que l'impression, vous devriez utiliser quelque chose comme ceci:

def recursive_unpack(iterable):
    for element in iterable:
        if isinstance(element, list):
            yield from recursive_unpack(element)
        else:
            yield element

Why I'm using isinstance() instead of type(): Differences between isinstance() and type() in python

Also, if you want this to apply to all iterables (my last example) and not just lists: In Python, how do I determine if an object is iterable?

0
ajouté
Merci l'homme j'ai complètement compris cela ... Et en fait, je l'ai déjà résolu en utilisant la récursivité ..Mais encore merci ..
ajouté l'auteur Mayukh Sarkar, source
Mais la solution sans récursion ne résoudra pas plusieurs listes imbriquées ... et la solution avec récursivité est la même que la mienne
ajouté l'auteur Mayukh Sarkar, source
Oui récursion est la bonne façon de faire cela .. mais il a de sérieux frais généraux de mémoire .. tous ces multi-push push & pops .. En outre, penser à une situation où sur un RAM processeur ARM limitée, pour effectuer une opération, je veux pour implémenter ceci..Tous ces niveaux récursifs créent beaucoup de mémoire et de surcharge de temps
ajouté l'auteur Mayukh Sarkar, source
Oui, votre solution est correcte et par conséquent je vous ai upvoted.
ajouté l'auteur Mayukh Sarkar, source
J'ai accepté votre réponse .. Désolé je suis un nouveau membre et par conséquent je ne savais pas cela
ajouté l'auteur Mayukh Sarkar, source
@MayukhSarkar Si vous pensez avoir une meilleure solution, postez-la ici comme réponse pour que tout le monde puisse la voir. Si c'est votre solution, ou une meilleure, s'il vous plaît accepter ma réponse comme la bonne solution :)
ajouté l'auteur Markus Meskanen, source
@MayukhSarkar Vous devriez accepter ma solution si c'est, il y a cette petite marque dans les flèches haut et bas. Et ce qui vient à votre problème de mémoire récurrente, c'est une toute autre question à poser sur ce site. Votre question initiale portait sur la raison pour laquelle la liste en retrait n'est pas imprimée, et maintenant vous posez des questions sur l'optimisation de la mémoire. Vous devriez vraiment créer une nouvelle question :)
ajouté l'auteur Markus Meskanen, source

le problème est dans l'instruction else, vous êtes en train de dire que si chacun n'est pas un int (dans votre cas, c'est une liste), alors mettez la liste p dans la liste interne.

Je pense que ce que vous essayez de faire peut être accompli par quelque chose comme

p = [1, 2, [1, 2, 3], 4, 5]
for element in p:
if type(element) == int:
    print element
else:
    for otherElement in element:
        if type(otherElement) == int:
            print otherElement

l'instruction else dans ce cas passe par la liste interne et vérifie les éléments qu'elle contient (otherElement)

0
ajouté