2013-10-01 17 views
7

Vì vậy, rõ ràng là tôi không thể làm điều này bằng Python (2.7):Python: tại sao không (a, b, c) = (* x, 3)

x = (1, 2,) 
(a, b, c) = (*x, 3) 

Nó có ý nghĩa trong đầu tôi, nhưng cũng ... tôi có thể tạo một hàm:

make_tuple = lambda *elements: tuple(elements) 

sau đó tôi có thể làm

(c, a, b) = make_tuple(3, *x) 

nhưng không, ví dụ

(a, b, c) = make_tuple(*x, 3) 
(a, b, c, d) = make_tuple(*x, *x) 
y = [3, 4] 
(a, b, c, d) = (*x, *y,) 

Vì vậy, những gì tôi yêu cầu là

  1. là có một lý do để không cho phép điều này? (điều đầu tiên)
  2. điều gần nhất hoạt động là gì?

đoán hiện tại của tôi cho # 2:

(a, b, c) = x + (3,) 
(a, b, c, d) = x + x 
(a, b, c, d) = x + tuple(y) 

Trả lời

8

Đáp lại câu hỏi 1, đọc PEP 448bug 2292. Cũng thú vị là thảo luận trong số mailing list. Trong sơ yếu lý lịch những gì bạn muốn được cho phép trong Python 3.4. Đối với câu hỏi 2, xem các giải pháp khác.

+0

Thú vị, và tuyệt vời Ngoài! – Mark

2

Đừng quên itertools. Nó thường dễ đọc hơn khi mọi thứ trở nên phức tạp hơn

>>> from itertools import chain 
>>> a,b,c = chain(x, (3,)) 
>>> a,b,c,d = chain(x, x) 
>>> a,b,c,d = chain(x, y) 
+0

Có lẽ là lựa chọn tốt nhất, mặc dù đó là một sự xấu hổ mà 3 vẫn cần phải được thực hiện thành một tuple ... – Mark

+1

@Mark, không có builtin "flatten", nhưng nhiều người trong số flatten recipies trên SO sẽ cho phép bạn nói 'a, b, c = flatten ((x, 3)) '. Bạn có thể hỗ trợ 'flatten (x, 3)' mà không cần thêm quá nhiều công việc. –

1

Những gì bạn có thể làm trong Python 2.7 là:

(a, b), c = x, 3 
+0

Thực sự là một giải pháp tốt đẹp trong trường hợp này, mặc dù quá xấu nó không thể tạo ra một tuple – Mark

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