質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Python 3.x

    6420questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

なぜエラーになるのかわかりません

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 236

mimamoru

score 9

前提・実現したいこと

ここに質問したいことを詳細に書いてください
Python3です
配列の各要素を2倍した配列を返す関数all2x(list)を作成したいです。
詳細
all2x(list)は配列を引数にとり、配列を返す関数です。
渡される配列は1つ以上の要素を持ちます。
実行例
all2x([1, 2, 3]) => [2, 4, 6]
all2x([0, 0, 0]) => [0, 0, 0]

発生している問題・エラーメッセージ

all2x([1, 2, 3])
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
all2x([1, 2, 3])
File "<pyshell#0>", line 3, in all2x
list[i]*=2
IndexError: list index out of range

該当のソースコード

def all2x(list):
for i in list:
list[i]*=2
return list

試したこと

def all2x(list):
return [x * 2 for x in list]
で済むことはわかりましたが上のコードで同じ結果は望めないのでしょうか?

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

こんにちは。

def all2x(list):
  for i in list:
    list[i]*=2
  return list

だと、 i  には、list の要素そのものが入ってきますが、
その書き方では、i に要素のインデクスが入って
くることを想定したコードになっているから、うまく動かない
のではないでしょうか?

参考になれば幸いです。


追記

def all2x(list):
  for i in list:
    list[i]*=2
  return list


all2x([1,2,3])


と書いて、実行してみたときに、[発生している問題・エラーメッセージ] にあるとおり
IndexError: list index out of range 
が出るわけですが、このメッセージは、
「リストのインデクスがリストの許容する範囲外になっている。」
という意味です。
これを見たときに、
「あれ? インデクスがリストの範囲外になってる?そんなはずはないだろう・・・さて?」
と思うことが大事です。
そう思えたら
「では、範囲外になってしまったインデクスの値は何だろう?」と思うでしょう。
すると、list[i]*=2 で、list のインデクスにしている i の値を
ループの毎回表示させるために、直前に print(i) を入れて

def all2x(list):
  for i in list:
    print(i)
    list[i]*=2
  return list

all2x([1,2,3])


を実行してみたりするわけです。(上記を main.py とします)
すると、以下のように、2回目の print(i) で(なんと) 4 が出力されます。

イメージ説明

最初のコードでは、i は リストのインデクスになる想定で書いており、
0, 1, 2 
になることを期待しているわけですから、上記の 4 で明らかに
何かがおかしいと思うことができます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 22:18

    詳しいソースコードまで載せていただきありがとうございました!とてもよくわかりました

    キャンセル

  • 2018/01/07 22:23

    解決したようでよかったです!

    キャンセル

+2

mkgreiさんの回答のほかに、こういうのもありです。

for i, _ in enumerate(my_list):
    my_list[i] *= 2

なぜエラーになるのかわかりません

printデバッグをしてみると、すぐに理由がわかるかと思いますよ。
下記のようにループを書いた場合、iは添え字ではなく各要素の値となります。

>>> for i in [3, 1, 4]:
...     print(i)
...
3
1
4

エラー自体はただの範囲外エラーです。(otnさんが指摘されているとおり)

>>> hoge = [1, 2]
>>> hoge[0]
1
>>> hoge[1]
2
>>> hoge[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

ついでに

リストのインスタンスの名前として、listは使わないでください。
組み込み型のlistを潰してしまい、具体的には次のような不可解なエラーを引き起こします。

>>> list(range(3))
[0, 1, 2]
>>> list = [4, 5, 6]
>>> list(range(3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

同様に、strdoublemaxminidなどは使ってはいけません。


teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 22:20

    解説から注意点まで教えてくださりありがとうございました!新しいことも知ることができてよかったです!

    キャンセル

+2

list[1, 2, 3]の時に、for i in list:だと、iは、添え字の0,1,2じゃなくて中身の1,2,3になるので、i3の時に添え字範囲オーバーになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 22:17

    ありがとうございます。なぜインデックスが超えてしまうのかが良くわかりました!助かりました!

    キャンセル

0

for i in range(len(list)):


追記:
もともとの書き方がうまくいくのはJavascriptやNode.jsだと思います。
以下のスクリプトは4,5,6,7,8ではなく0,1,2,3,4になります。
Pythonではfor...inはインデックスではなく中身が取り出されます。

var a = [4,5,6,7,8];
for (var i in a) {
  console.log(i);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 22:20

    素早い回答ありがとうございました とてもよくわかりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    6420questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。