2013-10-01 29 views
7

因此很明顯,我不能在Python這樣做(2.7):的Python:爲什麼不(A,B,C)=(* X,3)

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

在我的頭上是有道理的,但嗯...我可以創建一個功能:

make_tuple = lambda *elements: tuple(elements) 

然後我可以做

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

但不是,例如

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

那麼,我問是

  1. 是否有不允許這樣的原因是什麼? (第一件事)
  2. 最接近的工作是什麼?

我對#2目前的猜測:

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

回答

8

在回答問題1,閱讀PEP 448bug 2292mailing list中的討論也很有趣。繼續在Python 3.4中允許你想要的東西。對於問題2,請參閱其他解決方案。

+0

有趣,很好的補充! – Mark

2

不要忘記itertools。它通常是更具可讀性的事情變得更加複雜

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

也許是最好的選擇,雖然這是一個遺憾,3仍然需要成爲一個元組... ... – Mark

+1

@馬克,沒有內建的「扁平化」,但許多扁平接收SO會讓你說'a, b,c = flatten((x,3))'。你可以在沒有太多額外工作的情況下支持'flatten(x,3)'。 –

1

你可以在Python 2.7做的是:

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

在這種情況下確實是一個很好的解決方案,但它太糟糕了,無法創建一個元組 – Mark

相關問題