2015-11-03 14 views
5

Tôi đang đấu tranh với hành vi kỳ lạ này trong Python (2 và 3):inline Strange phân

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = 2, 1 

Điều này dẫn đến:

>>> a 
[1, 2] 

Nhưng nếu bạn viết

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = x, y 

nơi x, y != 2, 1 (có thể là 1, 1, 2, 2, 3, 5, v.v.), kết quả là:

>>> a == [x, y] 
True 

Như người ta mong đợi. Tại sao không a[a.index(1)], a[a.index(2)] = 2, 1 tạo kết quả a == [2, 1]?

>>> a == [2, 1] 
False 
+1

Bạn đã hỏi một câu hỏi lạ. Tại sao nên 'a [a.index (1)], một [a.index (2)] = 2, 1' in được gì? :) – Alik

+0

Ý tôi là khi yêu cầu giá trị a. Tôi đang lạm dụng ký pháp. XD – Dargor

+0

Related (and devious): http://stackoverflow.com/q/32127908/3001761 – jonrsharpe

Trả lời

10

Bởi vì nó thực sự được giải thích như thế này:

>>> a = [1, 2] 
>>> a 
[1, 2] 
>>> a[a.index(1)] = 2 
>>> a 
[2, 2] 
>>> a[a.index(2)] = 1 
>>> a 
[1, 2] 

Để trích dẫn, theo (tôi nhấn mạnh) standard rules for assignment:

  • Nếu danh sách mục tiêu là một bằng dấu phẩy danh sách các mục tiêu: Đối tượng phải có thể lặp lại với cùng số mục vì có các mục tiêu trong danh sách đích và các mục được gán, từ trái sang phải, đến các mục tiêu tương ứng.

Việc chuyển nhượng để a[a.index(1)] (ví dụ: a[0]) xảy ra trước nhiệm vụ thứ hai yêu cầu a.index(2), bởi thời gian a.index(2) == 0 đó.

Bạn sẽ thấy những hành vi tương tự đối với bất kỳ công việc:

foo = [a, b] 
foo[foo.index(a)], foo[foo.index(b)] = x, y 

nơi x == b (trong trường hợp này, việc chuyển nhượng trong đó giá trị đầu tiên ở phía bên tay phải là 2).

+1

Bạn có thể tham chiếu thứ tự gán trong Python từ tài liệu không? – Dargor

+0

Cảm ơn bạn trước! – Dargor

+0

Được thăng hạng và được chấp nhận. Cảm ơn bạn cho công việc tuyệt vời của bạn! – Dargor