Pythonを公式ドキュメントで勉強中のプログラミング初心者です。以下の文章について質問です。
list.append(x)
リストの末尾に要素を一つ追加します。a[len(a):] = [x] と等価です。
とドキュメントにあるのですが、a[len(a)] = [x]ではいけないのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
a[len(a)] = [x]
を実際に動かしてみるとわかりますが、「IndexError: list assignment index out of range」というエラーが出てしまいます。
Python
1a = [1, 2, 3] 2x = 4
たとえば上記を前提としたとき、a[len(a)] = [x]
は a[3] = [x]
となります。リストa
に "4番目の要素(0基点で3)” は存在しないため、a[3]
部分で範囲外アクセスエラーとなっています。
データのイメージ:
+---+---+---+ a = | 1 | 2 | 3 | +---+---+---+ ↑ 要素a[3]
一方、a[len(a):] = [x]
は a[3:] = [x]
となります。a[3:]
はスライス(slice)表記とよばれるもので、「リストa
の4番目(0基点で3)から末尾までの範囲」を表します。
これは先ほどと同様に、存在しない4番目を指しているのですが、実際に要素へアクセスすることはなく、「仮想的にその位置を指している」だけと解釈ください。(納得しにくいかもしれませんが、そういうルールということで...)
改めてa[3:]
を解釈すると、「リスト[1, 2, 3]
に続いている仮想的な空っぽのリスト」となります。この部分に新しいリスト[x]
つまり[4]
を代入すると、元のリスト[1, 2, 3]
と新しいリスト[4]
が連結されて、結果のリスト[1, 2, 3, 4]
が得られます。
データのイメージ:
+---+---+---+...+ a = | 1 | 2 | 3 | | +---+---+---+...+ <-> 範囲a[3:]
投稿2017/05/19 09:28
編集2017/05/19 09:32総合スコア6191
0
一応、公式ドキュメントに説明があります。
・ターゲットが添字表記なら: (略)
一次語が (リストのような) ミュータブルなシーケンスオブジェクトであれば、添字表記は整数を与えなければなりません。整数が負なら、シーケンスの長さが加算されます。整数は最終的に、シーケンスの長さよりも小さな非負の整数でなくてはならず、シーケンスは、そのインデクスに持つ要素に被代入オブジェクトを代入してよいか問い合わせられます。インデクスが範囲外なら、 IndexError が送出されます (添字指定されたシーケンスに代入を行っても、リスト要素の新たな追加はできません)。
・ターゲットがスライスなら:参照されている一次語式が評価されます。一次語式は、(リストのような) ミュータブルなシーケンスオブジェクトを与えなければなりません。被代入オブジェクトは同じ型のシーケンスオブジェクトでなければなりません。 次に、スライスの下限と上限を示す式があれば評価されます; デフォルト値はそれぞれ 0 とシーケンスの長さです。上限と下限の評価は整数でなければなりません。いずれかの境界が負数なら、シーケンスの長さが加算されます。最終的に、境界は 0 からシーケンスの長さまでに収まるように刈りこまれます。最後に、スライスを被代入オブジェクトで置き換えてよいかシーケンスオブジェクトに問い合わせます。ターゲットシーケンスで許されている限り、スライスの長さは被代入シーケンスの長さと異なっていてよく、この場合にはターゲットシーケンスの長さが変更されます。
非常に難解な日本語ですが、簡単に書くと
- a[len(a)] のような表記の場合は、要素への代入ができる-追記はできない。
(Indexが範囲外の場合は IndexErrorが送出される)
- a[len(a):]のようなスライスの場合、その下限(上限)以降を代入元のリストで置き換える。
(その結果、リストの長さが変更してもOK)
です。
投稿2017/05/19 10:19
総合スコア15898
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/19 15:49