Đây là một hoạt động; biểu thức bên phải được đánh giá trước khi việc chuyển nhượng trái được áp dụng:
>>> a, b = 10, 20
>>> a, b
(10, 20)
>>> b, a = a, b
>>> a, b
(20, 10)
>>> a, b = a*b, a/b
>>> a, b
(200, 2)
Hoặc, nếu bạn đang nói về môi trường đa luồng, sau đó phân công là không nguyên tử; người phiên dịch đánh giá một giao tuple với một opcode duy nhất, nhưng sử dụng opcodes riêng biệt để sau đó lưu trữ các kết quả vào mỗi biến ảnh hưởng:
>>> def t(self): a,b=20,20
...
>>> dis.dis(t)
1 0 LOAD_CONST 2 ((20, 20))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 1 (a)
9 STORE_FAST 2 (b)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Tuy nhiên, bình thường assigment sẽ luôn luôn có ít nhất hai opcodes (một cho biểu thức bên phải, một để lưu trữ kết quả), vì vậy trong python nói chung, assigment không phải là nguyên tử. Giải nén trình tự không khác nhau.
Nguồn
2012-11-30 17:04:04
Tôi dưới ấn tượng rằng bạn có lẽ là sự hiểu lầm bởi những gì là * thường được hiểu bởi nguyên tử trong phát triển phần mềm. Bạn đang nói về an toàn thread ở đây, hoặc bạn đang tự hỏi nếu 'a = c' sẽ được thực thi trước' b = d'? –
@MartijnPieters - Nếu OP đã tự hỏi về sau này, OP sẽ rất bối rối tại sao một cái gì đó như '(a, b) = (b, a)' sẽ làm việc để trao đổi các giá trị. Nó phải là một câu hỏi về an toàn luồng. –
@TedHopp: Câu hỏi là quá mơ hồ để gọi điều này, và trong kinh nghiệm của tôi giải nén tuple gây ra rất nhiều nhầm lẫn trong và của chính nó. –