Jest to bardzo prosty problem, ale nie mam pojęcia, dlaczego Python to robi. W przypadku pętli poniżej, if head != None... tworzy zmienną lokalną, taką, że head += 1 nie modyfikuje głowicy w for head in myHeap.array. Dodawanie druku (głowicy) zaraz po udzieleniu głowicy + = 1 wytwarza wynik, którego chcę, ale głowa poza instrukcją, jeśli pozostaje taka sama.

    for head in myHeap.array:
        if head != None and count % int(grow) == 0:
            head += 1

Tak więc wejście myheap.array = [2, 2, 2, 1] Wyjścia tej samej listy na końcu iteracji, gdy oczekuje się [3, 3, 3, 2]. Weryfikowałem również, że warunek jest spełniony dla oświadczenia IF, a tłumacz wykorzystuje linię head += 1

1
kylecblyth 24 listopad 2013, 07:09

2 odpowiedzi

Najlepsza odpowiedź

Musisz uzyskać dostęp do elementów listy myheap.array, aby je zmodyfikować. Coś takiego:

class myHeap(object):
    pass

myHeap.array = [2, 2, 2, 1]

for n, head in enumerate(myHeap.array):
    if head != None:
        myHeap.array[n] = head + 1

print myHeap.array

Wynik:

[3, 3, 3, 2]
5
Holy Mackerel 24 listopad 2013, 03:30

Uruchom to i przyjrzyj się ściśle na generowanych identyfikatorach.

listt = [2, 3]

for i in listt:
    print(id(i))
    i += 1
    print(id(i))
    print()

print(listt)
print()

for i in range(len(listt)):
    print(id(listt[i]))
    listt[i] += 1
    print(id(listt[i]))
    print()

print(listt)

W tym kodzie jest to, że odniesienie do obiektu w zmiennej tymczasowej jest aktualizowane, aby nie zawiera już odniesienia do obiektu na liście. Dlatego nie widzisz zmian na liście. Musisz zaktualizować referencje w elementach listy. Aby uzyskać bezpośrednio uzyskiwać dostęp do tych zmiennych bezpośrednio tj. Przez np.

1
Aseem Bansal 24 listopad 2013, 03:22