2013-10-01 19 views
7

Więc najwyraźniej nie mogę tego zrobić w Pythonie (2,7):Python: dlaczego nie (a, b, c) = (x *, 3)

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

To miało sens w mojej głowie, ale dobrze ... I może utworzyć funkcję:

make_tuple = lambda *elements: tuple(elements) 

wtedy mogę zrobić

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

ale nie na przykład

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

Więc co pytam jest

  1. jest jakiś powód, dla nie pozwalając tym? (pierwsza rzecz)
  2. jaka jest najbliższa rzecz, która działa?

Mój obecny przypuszczenie dla # 2:

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

Odpowiedz

8

W odpowiedzi na pytanie 1, czytać PEP 448 i bug 2292. Interesująca jest również dyskusja w mailing list. W życiorysie to, czego chcesz, powinno być dozwolone w Pythonie 3.4. Na pytanie 2 zobacz inne rozwiązania.

+0

ciekawe, i wspaniały dodatek! – Mark

2

Nie zapomnij o itertools. Jest to zazwyczaj bardziej czytelne jak robi się bardziej skomplikowane

>>> 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

Prawdopodobnie najlepsza alternatywa, choć szkoda, że ​​3 nadal trzeba wprowadzić w krotkę ... – Mark

+1

@Mark, nie ma wbudowanego "spłaszczenia", ale wiele spłaszczonych receptur na SO pozwoli ci powiedzieć "a, b, c = spłaszczyć ((x, 3)) '. Możesz wesprzeć 'flatten (x, 3)' bez zbytniej dodatkowej pracy. –

1

Co można zrobić w Pythonie 2.7 jest:

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

Rzeczywiście dobre rozwiązanie w tym przypadku, choć szkoda, że ​​nie może utworzyć jednej krotki – Mark

Powiązane problemy