2017-06-19 12 views
1

私が期待される出力で、外側のタプルを取り除くのはなぜ:このコードで...は、スライスの割り当てはPython

>>> [1, ("Hello", (2, 3)), 4] 

>>> [1, "Hello", (2, 3), 4] # No tuple around "Hello", (2, 3) 

rl = [1, 4] 
test_sl = ("Hello", (2, 3)) 
rl[1:1] = test_sl 
print(rl) 

代わりに私をもたらしました

なぜですか?

+0

あなたがuseingできる 'r1は、[1] = test_s1'あなたは、私が入力をお願い – liansheng

+0

をしたい取得します。これは2をタプルに置き換えます。私はタクトでタプルを使って* [1、*ここ*、2]の間に*を挿入しようとしています。 (分かりやすくするために変更されます) –

答えて

4

これは、スライスの割り当てがPythonでどのように機能するためです。イテレートはスライスにのみ割り当てることができ、Pythonはイテレート可能なすべてのアイテムを繰り返しからスライスに割り当てます。たとえば、次のように

>>> def ten(): 
... for n in range(10): 
...  yield(n+1) 
... 
>>> a = ['hello'] 
# directly assigning an iterable - function that yields things 
>>> a[1:1] = ten() 
>>> a 
['hello', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
# a string can be an iterable - iterates over its characters 
>>> a[2:2] = 'hello' 
>>> a 
['hello', 1, 'h', 'e', 'l', 'l', 'o', 2, 3, 4, 5, 6, 7, 8, 9, 10] 
# can't assign something that isn't iterable! 
>>> a[1:1] = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can only assign an iterable 
# as a tuple is iterable, only the contents will be assigned to the list 
>>> a[1:1] = ('hello', 'world') 
>>> a 
['hello', 'hello', 'world', 1, 'h', 'e', 'l', 'l', 'o', 2, 3, 4, 5, 6, 7, 8, 9, 10] 

編集:(私が知っている、しかし、あなたが達成するために欠けているものに近いかもしれ割り当てるスライスない)Pythonのリストのinsert方法を使用することができ、あなたの問題を解決する簡単な方法:

rl.insert(1, test_sl) 
+1

あなたは素晴らしいです!あなたが投稿したすべての例は、私にそれを非常に明確にしました。ありがとう、swalladge。 –

+3

OPは 'rl [1:1] =(test_sl) 'で希望の動作を得ることができるというこの答えを読んだ後に明白かもしれないちょっとした注意です。 –

+1

@MichaelMior良い点! OPの問題を解決する別の方法を含めるように私の答えを編集しました。 :) – swalladge