65286


[AOJ
ITP1_9_B](https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/9/ITP1_9_B)に関してのコードで、  
slicingを使って文字列先頭の数文字を最後尾に移動させたいのですが、

[code]

    word = list(input())
    time = int(input())
    for k in range(time):
      h = int(input())
      tmp1 = word[h:]
      tmp2 = tmp1.extend(word[:h])
      word = tmp2
    print(word)
    
[/code]

この場合、

[code]

    TypeError                                 Traceback (most recent call last)
    <ipython-input-4-42a708007e58> in <module>()
          3 for k in range(time):
          4   h = int(input())
    ----> 5   tmp1 = word[h:]
          6   tmp2 = tmp1.extend(word[:h])
          7   word = tmp2
    
    TypeError: 'NoneType' object is not subscriptable
    
[/code]

とエラーが出てしまいます。  
Noneのタイプのobjectは何を指しているのでしょうか。

[code]

    print(type(word))
    
[/code]

としてもきちんと

[code]

    <class 'list'>
    
[/code]

と帰ってきます。  
原因が不明なので、どなたか教えていただけると幸いです。


CC BY-SA 4.0
2020-04-01T13:49:44.317
65284
2020-04-01T15:31:08.707
36869
question
python python3
'NoneType' object is not subscriptable エラーの対処法


以下の記事と同件ですね。  
[csvで読み込んだリストに情報を加えたいがNoneが返ってくる](https://ja.stackoverflow.com/q/62319/26370)

リスト操作(`extend`を含む)の戻り値は処理結果のオブジェクトではなく`None`を返します。  
質問のソースの以下の処理は、`tmp2`と`word`に`None`を代入することになります。

[code]

    tmp2 = tmp1.extend(word[:h])
    word = tmp2
    
[/code]

以下の処理は、ループの初回では`word`は有効なリストですが、ループの2回目は`None`なのでエラーになります。

[code]

    tmp1 = word[h:]
    
[/code]

それからsliceして付け替える処理とか順番も微妙に間違っている感じですね。  
いったん切り出して連結するなら、おそらく以下のようになると思われます。  
(と書いたら@metropolisさんがもっと効率的な処理をコメントされていましたが)

[code]

    tmp1 = word[:h]
    word = word[h:]
    word.extend(tmp1)
    
[/code]


CC BY-SA 4.0
2020-04-01T15:16:10.297
65286
2020-04-01T15:31:08.707
2020-04-01T15:31:08.707
26370
26370
65284
answer