Donc, dans le premier code, je crée a.next = b. Ce qui signifie que a.next et b agissent comme une référence à Node6. SO quand je fais b = None .. Pourquoi est-ce que a.next pointe toujours vers Node6,
Dans le deuxième code, quand je suis en train de faire c = a, c et a sont des références au Node 5. Maintenant je fais c.next = None, mais ce changement se reflète également dans un. même a.next devient None.
LES DEUX CODES J'AI FAIT LES MÊMES ÉTAPES, Pourquoi le changement n'est-il reflété que dans le code 2?
class Node: def __init__(self, x): self.val = x self.next = None a=Node(5) b=Node(6) a.next=b c=a c.next=None while a is not None: print(a.val) a=a.next
CODE 2
class Node: def __init__(self, x): self.val = x self.next = None a=Node(5) b=Node(6) a.next=b b=None while a is not None: print(a.val) a=a.next
3 Réponses :
Dans le premier cas, vous stockez b
dans a.next
, donc en parcourant la liste liée avec le nœud principal comme a
vous traverser tous les nœuds.
Mais dans le second cas, c
et a
ayant la même référence, et c.next
est Aucun
donc chaque fois que vous parcourez la liste liée avec la tête comme c
, vous obtenez un seul nœud. Comme alors que a n'est pas None
condition ne permettant pas de se déplacer pour le nœud suivant.
Le code suivant fonctionne comme prévu.
class Node: def __init__(self, x): self.val = x self.next = None a = Node(5) b = Node(6) c = a c.next = b #this line changed while a is not None: print(a.val) a = a.next
p>
Merci une tonne mec
Vous avez une classe Node
. Lorsque vous créez un objet de cette classe et que vous l'assignez à une variable telle que a
ou b
, vous allouez dynamiquement une mémoire suffisamment grande pour contenir le contenu de l'objet, puis attribuer l ' adresse de cette mémoire à la variable. Donc CODE 1 vraiment ressemble plus à:
x = 5 y = 7 x = y y = 0
La déclaration 5 met à jour l'attribut next
du nœud qui a été alloué dans la déclaration 1 avec la valeur de b
, qui est addr2
. Dans la déclaration 6, nous attribuons une nouvelle valeur à b
, mais cela ne changera pas ce qui a été stocké dans l'objet réel référencé par a
. Prenons l'exemple suivant avec des entiers:
addr1 = storage address for Node(5) // Statement 1 a = addr1 // Statement 2 addr2 = storage address for Node(6) // Statement 3 b = addr2 // Statement 4 a.next = b // Statement 5 b = None // Statement 6
Le paramètre y = 0
n'affecte pas l'affectation précédente de x = y code >, c'est-à-dire que x aura toujours la valeur précédente de y de 7. La seule différence dans votre exemple est que nous n'avons pas affaire à des entiers mais à des adresses.
Maintenant que nous apprécions que a code > et
b
sont en réalité des références à des emplacements mémoire (c'est-à-dire des adresses) qui contiennent les objets réels, quand vous dites c = a
, c et a font maintenant référence au même objet et peuvent être utilisés de manière interchangeable. Ainsi, c.next
et a.next
font référence au même attribut.
Merci Monsieur pour l'aide
Permettez-moi de vous expliquer en utilisant une représentation schématique:
Dans le cas 1: la liste a
a deux nœuds 5 et 6 dans la liste liée.
Mais dans le cas 2: les listes a
et c
ont un nœud 5 dans la liste chaînée. Et une autre liste chaînée est pointée par b
qui n'en a que 6.
J'espère que cela clarifie votre doute.
REMARQUE:
- Puisque a, b, c sont des pointeurs stockant des adresses. Lorsque vous exécutez c.next = None
, la valeur de next à l'adresse pointée par c
(également pointée par a
) devient None. p>
Mm merci. J'ai eu du mal à comprendre cela. Je suppose que c'est tellement basique lol
Heureux d'aider! Les pointeurs sont parfois déroutants dans le code, ce n'est que lorsque vous les écrivez qu'ils deviennent clairs.
Ouais ... C'est drôle, c'est similaire à ça, a = 5, b = 6, a = b, b = 66 ... Lol
Dans le premier exemple, vous définissez
b
surAucun
ce qui ne supprime pas l'objet référencé, car il y a encore une référence à cet objet dansa.next
. Dans le deuxième exemple, vous ne changez rien, car vous définisseza.next
surNone
, ce qui est déjàNone
par défaut.J'ai édité code2. Veuillez répondre pour cela monsieur.
Mais maintenant, les premier et deuxième exemples sont les mêmes.
Désolé voir maintenant monsieur.
WHen I make c.next = None ... Pourquoi a.next devient-il également None? Je fais exactement la même chose.
Lorsque vous créez
c = a
, vous ne passez pas les valeurs de a mais la référence à a. Donc, à partir de là, c fera référence au même objet auquel se réfère a.Dans le premier code, même a.next fait référence à b, non? Node6 dans les deux. Alors pourquoi ne change-t-il pas?
@NeverGiveUp, parce que vous ne le changez pas.
b
stocke la référence à l'objet.a.next
stocke la référence à un objet dame. Vous avez juste une référence nulle, pas un objet.