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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

4回答

880閲覧

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

mimamoru

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2018/01/07 05:09

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

投稿2018/01/07 05:16

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamoru

2018/01/07 13:17

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

0

ベストアンサー

こんにちは。

python

1def all2x(list): 2 for i in list: 3 list[i]*=2 4 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) を入れて

python

1def all2x(list): 2 for i in list: 3 print(i) 4 list[i]*=2 5 return list 6 7all2x([1,2,3])

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

イメージ説明

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

投稿2018/01/07 05:15

編集2018/01/07 06:40
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamoru

2018/01/07 13:18

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

2018/01/07 13:23

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

0

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

Python

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

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

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

Python

1>>> for i in [3, 1, 4]: 2... print(i) 3... 43 51 64

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

Python

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

ついでに

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

Python

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

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


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

投稿2018/01/07 05:14

編集2018/01/07 05:34
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamoru

2018/01/07 13:20

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

0

for i in range(len(list)):


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

Javascript

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

投稿2018/01/07 05:11

編集2018/01/07 06:31
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mimamoru

2018/01/07 13:20

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問