Katakanlah saya memiliki nama dan objek berikut

original = n = <original_object>
n = n.next = <new_object>

Setelah menjalankan di atas saya berharap untuk melihat original menunjuk ke <original_object>, tetapi tampaknya tidak demikian.

Namun, jika saya malah melakukan:

original = n = <original_object>
n.next = <new_object> # Attribute of the object class
n = n.next

Saya kemudian melihat original menunjuk ke <original_object> (atau setidaknya itulah yang saya pikir saya lihat).

Contoh konkrit

Saya akan mengilustrasikan ini dengan daftar tertaut di Python 3.8:

class Node:
    def __init__(self, arg1):
        self.next = None

Dengan tugas berantai:

head = n = Node(None)
n = n.next = Node(None)
print(head.next) # None (the "head" is gone?)

Dengan tugas berturut-turut:

head = n = Node(None) 
n.next = Node(None) # *
n = n.next # *
print(head.next) # <__main__.Node object at 0x7fa4e0610ca0>

Maksud saya di sini adalah untuk mempertahankan "kepala" dari daftar tertaut saat saya menambahkan simpul di bagian ekor. Mengapa saya mendapatkan hasil yang berbeda dengan tugas berantai vs berurutan?

1
Amelio Vazquez-Reina 23 April 2020, 02:18

1 menjawab

Jawaban Terbaik

Seperti yang dicatat dengan cepat oleh @Carcigenicate, jawaban ini menjelaskan apa yang terjadi:

Singkatnya, mengikuti argumen itu dalam contoh saya, Jika saya melakukannya:

n = n.next = Node(None)

Itu setara dengan:

temp = Node(None)
n = temp
n.next = temp

Jadi n diberi simpul baru sebelum saya "memajukan penunjuk saat ini" (n) di daftar tertaut, sedangkan yang saya inginkan lakukan adalah membuat simpul baru terlebih dahulu, menautkannya, dan lalu "majukan penunjuk saat ini" (n) ke simpul baru.

0
Amelio Vazquez-Reina 23 April 2020, 01:37