Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
262 views
in Technique[技术] by (71.8m points)

How Python assign multiple variables at one line works?

What are the steps that Python actually does to assign multiple variables at one line?

I use to do A[0], A[1] = A[1], A[0] to swap, but recently I got a bug when assigning a linked list.

# insert self->node->...
def insert_next(self, node): 
  node.next, node.prev = self.next, self
  self.next, self.next.prev = node, node

self.next become node earlier than I expected, so the assign become

self.next, node.next = node, node     

However, if I do

self.next.prev, self.next = node, node

It works!

I "assume" the steps are

1. cache values at the right side
2. assign to left side one by one, left to right

not

1. cache values at the right side
2. cache the ref at the left side
2. assign to ref one by one, left to right

So, what are the steps?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

There's something called "expansion assignment" in Python.

Long story short, you can expand an iterable with assignment. For example, this code evaluates and expands the right side, which is actually a tuple, and assigns it to the left side:

a, b = 3, 5

Or

tup = (3, 5)
a, b = tup

This means in Python you can exchange two variables with one line:

a, b = b, a

It evaluates the right side, creates a tuple (b, a), then expands the tuple and assigns to the left side.

There's a special rule that if any of the left-hand-side variables "overlap", the assignment goes left-to-right.

i = 0
l = [1, 3, 5, 7]
i, l[i] = 2, 0  # l == [1, 3, 0, 7] instead of [0, 3, 5, 7]

So in your code,

node.next, node.prev = self.next, self

This assignment is parallel, as node.next and node.prev don't "overlap". But for the next line:

self.next, self.next.prev = node, node

As self.next.prev depends on self.next, they "overlap", thus self.next is assigned first.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...