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

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

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

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

Q&A

解決済

2回答

2729閲覧

a[len(a):] = [x]

TylerDurden

総合スコア7

Python 3.x

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

3グッド

1クリップ

投稿2017/05/19 08:44

Pythonを公式ドキュメントで勉強中のプログラミング初心者です。以下の文章について質問です。

list.append(x)
リストの末尾に要素を一つ追加します。a[len(a):] = [x] と等価です。

とドキュメントにあるのですが、a[len(a)] = [x]ではいけないのでしょうか?

digitalhimiko, rege, yohhoy👍を押しています

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

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

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

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

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

guest

回答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
yohhoy

総合スコア6191

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

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

TylerDurden

2017/05/19 15:49

具体例を添えた分かりやすい説明が非常にありがたいです。 a[len(a)] = [x]がダメだということが非常によくわかりました。
guest

0

一応、公式ドキュメントに説明があります。

・ターゲットが添字表記なら: (略)

一次語が (リストのような) ミュータブルなシーケンスオブジェクトであれば、添字表記は整数を与えなければなりません。整数が負なら、シーケンスの長さが加算されます。整数は最終的に、シーケンスの長さよりも小さな非負の整数でなくてはならず、シーケンスは、そのインデクスに持つ要素に被代入オブジェクトを代入してよいか問い合わせられます。インデクスが範囲外なら、 IndexError が送出されます (添字指定されたシーケンスに代入を行っても、リスト要素の新たな追加はできません)。

・ターゲットがスライスなら:参照されている一次語式が評価されます。一次語式は、(リストのような) ミュータブルなシーケンスオブジェクトを与えなければなりません。被代入オブジェクトは同じ型のシーケンスオブジェクトでなければなりません。 次に、スライスの下限と上限を示す式があれば評価されます; デフォルト値はそれぞれ 0 とシーケンスの長さです。上限と下限の評価は整数でなければなりません。いずれかの境界が負数なら、シーケンスの長さが加算されます。最終的に、境界は 0 からシーケンスの長さまでに収まるように刈りこまれます。最後に、スライスを被代入オブジェクトで置き換えてよいかシーケンスオブジェクトに問い合わせます。ターゲットシーケンスで許されている限り、スライスの長さは被代入シーケンスの長さと異なっていてよく、この場合にはターゲットシーケンスの長さが変更されます。

非常に難解な日本語ですが、簡単に書くと

  • a[len(a)] のような表記の場合は、要素への代入ができる-追記はできない。

(Indexが範囲外の場合は IndexErrorが送出される)

  • a[len(a):]のようなスライスの場合、その下限(上限)以降を代入元のリストで置き換える。

(その結果、リストの長さが変更してもOK)

です。

投稿2017/05/19 10:19

magichan

総合スコア15898

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

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

TylerDurden

2017/05/19 14:31

要点をまとめていただいて助かりました。ありがとうございます。 忘れた時のためにメモっときます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問