In solving the problem 206. Reverse Linked List I noticed a weird behavior in python.
Usually, we solve it like this:
def reverseList(self, head: ListNode) -> ListNode:
prev, cur = None, head
while cur:
nextTemp = cur.next
cur.next = prev
prev = cur
cur = nextTemp
return prevIt's possible to use multiple assignment to make it one line:
def reverseList(self, head: ListNode) -> ListNode:
prev, cur = None, head
while cur:
cur.next, cur, prev = prev, cur.next, cur
return prevHere's the catch. If I change the 4th line to
curr, prev, curr.next = curr.next, curr, prevI get this error:
'NoneType' object has no attribute 'next'
Why is this? Aren't the 3 assignment supposed to happen at the same time?
As it turns out, the issue was with how multiple assignments on the same line work. These assignments actually don't happen at the same time. Let me explain how it works.
First, the values on the right side are evaluated as a tuple. i.e. (curr.next, curr, prev). No problem up to this point.
The issue is on the left side. With the right side evaluated, python unpacks the tuple and assigns the values to the variables on the left IN ORDER, with the variables being (curr, prev, curr.next). See the problem now? curr is updated before curr.next is updated, so curr may be set to None before prev is assigned to cur.next.