66377


リストを引数xとし、xの要素を逆順に並べたリストを返す関数を作りたいのですが、

[code]

    def num5(x):
      for i in range(len(x)):
        x[i] = y[-(i+1)]
      return y
    
[/code]

以上のコードだと

[code]

    num5([1,2,3,4,5])
    
[/code]

を実行した場合、

[code]

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-21-c2a7a4692d72> in <module>()
          3     x[int(i)] = y[-int(i+1)]
          4   return y
    ----> 5 num5([1,2,3,4,5])
    
    <ipython-input-21-c2a7a4692d72> in num5(x)
          1 def num5(x):
          2   for i in range(len(x)):
    ----> 3     x[int(i)] = y[-int(i+1)]
          4   return y
          5 num5([1,2,3,4,5])
    
    TypeError: 'float' object is not subscriptable
    
[/code]

と、添え字がfloatになっているとエラーが出てしまいます。  
どの段階で添え字がintからfloatになってしまっていたのか見当がつきません。  
どなたか教えていただけると幸いです。


CC BY-SA 4.0
2020-05-07T05:37:39.427
66375
2020-05-07T05:54:36.450
36869
question
python python3
reversed関数を使わずにリストの要素を逆順にする関数を作ろうとしたがエラーが出る


_**添え字がfloatになっているとエラーが出てしまいます**_

エラーメッセージの読み方が間違っているようです。

> `'float' object is not subscriptable`
>
> `'float'`型のオブジェクトには添字を使用することはできません

と言っています。これは「添え字がfloat」なのではなく、「添字をつけられる側(今の場合`y`)が`float`になっている(から添字なんてつけられない)」と言っているわけです。

あなたのコードには`y`を初期化するコードが見当たりませんから、以前にグローバル変数としての`y`に`float`型の値を代入した結果が残っているのだと思われます。

一次変数を使用する前には、不用意にグローバル変数として扱われないように必ず初期化しましょう。

ついでに、あなたは`y`に結果を入れて返そうとしてるわけですから、代入の向きが逆ですね。

[code]

    def num5(x):
      y = [0] * len(x)
      for i in range(len(x)):
        y[-(i+1)] = x[i]
      return y
    
[/code]

「(reversedを使わずに)xの要素を逆順に並べたリストを返す」と言うお題については、他にいくつか書き方が考えられますが、現在のあなたのコードを最大限に活かすとこんな感じでしょう。


CC BY-SA 4.0
2020-05-07T05:54:36.450
66377
2020-05-07T05:54:36.450
2020-06-17T08:14:45.997
-1
13972
66375
answer