2010-10-15 46 views
5

Hãy xem hàm getPos() trả về một tuple. Sự khác biệt giữa hai bài tập sau đây là gì? Một nơi nào đó tôi nhìn thấy một ví dụ mà nhiệm vụ đầu tiên đã được sử dụng nhưng khi tôi chỉ cố gắng thứ hai, tôi đã rất ngạc nhiên khi nó cũng làm việc. Vì vậy, có thực sự là một sự khác biệt, hoặc không Python chỉ ra rằng phần bên tay trái nên là một tuple?x, y = getPos() so với (x, y) = getPos()

def getPos(): 
    return (1, 1) 

(x, y) = getPos() # First assignment 
x, y = getPos() # Second assignment 

Trả lời

8

Đọc về tuples:

Một tuple bao gồm một số các giá trị cách nhau bởi dấu phẩy (...)

Vì vậy, dấu ngoặc đơn không tạo thành bộ tuple. Các dấu phẩy làm điều đó.

ngoặc chỉ cần thiết nếu bạn có cấu trúc lồng nhau kỳ lạ:

x, (y, (w, z)), r 
+2

Ngoài ra để thực hiện một đơn giá trị tuple: '(x,)' – fortran

+0

Có, mặc dù các cụm từ "đóng gói tuple" và "giải nén tuple" gợi ý rằng nó không đơn giản như các danh sách được phân cách bằng dấu phẩy luôn là các bộ dữ liệu theo nghĩa đen. – Skilldrick

+1

Ví dụ: 'type (1, 2, 3)' không trả về 'tuple'. – Skilldrick

5

Vâng, nó được gọi là tuple unpacking:

"tuple giải nén đòi hỏi danh sách các biến trên bên trái có cùng một số yếu tố như độ dài của các tuple." - Guido Van Rossum

"Khi bạn sử dụng tuples hoặc danh sách ở bên trái của dấu =, Python ghép các đối tượng ở bên phải với các mục tiêu ở bên trái và gán chúng từ trái sang phải." - Lutz và Ascher

3

có, và nó cũng hoạt động trên danh sách

>>> x,y,z = range(3) 
>>> print x, y, z 
0 1 2 
>>> 
4

Không có sự khác biệt:

>>> import dis 
>>> dis.dis(compile("a,b = expr()", "", "single")) 
    1   0 LOAD_NAME    0 (expr) 
       3 CALL_FUNCTION   0 
       6 UNPACK_SEQUENCE   2 
       9 STORE_NAME    1 (a) 
      12 STORE_NAME    2 (b) 
      15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE   
>>> dis.dis(compile("(a,b) = expr()", "", "single")) 
    1   0 LOAD_NAME    0 (expr) 
       3 CALL_FUNCTION   0 
       6 UNPACK_SEQUENCE   2 
       9 STORE_NAME    1 (a) 
      12 STORE_NAME    2 (b) 
      15 LOAD_CONST    0 (None) 
      18 RETURN_VALUE   

Cả a, b(a, b) định một tuple, và bạn cần một tuple trong LHS (phía bên tay trái) để giải nén tuple :)

Các vấn đề liên quan