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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

Q&A

解決済

3回答

3096閲覧

リストの初期化が必要ない場合はいつか?

sequelanonymous

総合スコア123

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

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

0グッド

0クリップ

投稿2019/03/20 18:14

編集2019/03/21 02:11

タイトル通り、配列を利用するときに初期化しているコードと初期化せずに値をいれて使っているコードがありますが、初期化が必要ない場合っていうのは一言でいうとどういう場合でしょうか?

初期化が必要なケースはわかっていますが、そうじゃないケースだからといって必要がないか場合があるかどうかは、違うのかなと思っています。

初期化が必要なケースはこちらのリンク

python

1 param_list = [ 2 ("a", "STRING", a), 3 ("b", "STRING",b), 4 ("c", "STRING", c) 5 ] 6
a = [] a = df_results.values.tolist()

--補足
以下の記事
に記載されてるように、listオブジェクトを作成してから値を代入するほうが速度が増すなどの検証結果がかかれてたりします。

リストの初期化の種類はこの記事

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

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

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

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

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

guest

回答3

0

ベストアンサー

あなたのいう「初期化」とはなんですかね?

「変数への初回の代入」という意味なら、何にでも初回はあるので、かならず初期化はあります。


Python

1a = [] 2a = df_results.values.tolist()

というコードをお書きですが、あなたの言う初期化が「変数に何かを代入する前に、その変数に何かを代入しておく」という意味なら、それは無意味というか、書いてはいけません。

この場合、a = []は無意味で、書いてはいけません。書いていいのは、2つ目の式で変数aを参照するケースです。

Python

1a = [] 2a = foo(a).bar()

とか。良い書き方かどうかは別として。

投稿2019/03/21 00:15

otn

総合スコア86293

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

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

sequelanonymous

2019/03/21 01:47

> あなたの言う初期化が「変数に何かを代入する前に、その変数に何かを代入しておく」という意味なら、それは無意味というか、書いてはいけません。 コメントありがとうございます。まさに、ここの部分の理由を知りたくご質問させていただきました。 なぜ、以下のコードだと、a=[]を書く必要はないのでしょうか? a = [] a = df_results.values.tolist() ーー また、下記の様なコードでも配列から値を取る際に作成する数ごとに初期化して箱を作る必要があるという意味で初期化を理解していました。しかし、なぜ初期化が必要なのかどうか不明瞭に感じています。 以下は、データフレームを二次元配列に変換 a = df_results.values.tolist() # 下記、二次元配列の初期化をして値を取り出す lists = [[None] * len(a) for _ in range(len(a))] lst = [[c] * len(a) for b in range(len(a))]
otn

2019/03/21 03:19

> なぜ、以下のコードだと、a=[]を書く必要はないのでしょうか? a=1 a=2 a=3 a=4 print(a) #4を出力 というコードがあったとして、a=1 a=2 a=3の3行を書く必要が無いことは分かりますか?それと同じなのですが。 > また、下記の様なコードでも配列から値を取る際に作成する数ごとに初期化して箱を作る必要があるという意味で初期化を理解していました。 これは、Pythonに、「リストの宣言」という機能が無いため、あらかじめデータの入る予定の添え字の場所を作っておく必要があります。存在しない添え字でアクセスするとエラーになるので。 配列宣言のある言語、例えば、C言語だと、int lists[3][5]; などで2次元配列を宣言でき、初期化は特に不要です(必要があればしてもいい)。 もう少し一般的・抽象的に書くと、構造を持ったデータを変数に持ちたい場合、構造まるごと代入するならその一度の代入のみで良いのですが、構造の中の各要素を個別に代入したい場合は、まず最初に、構造の入れ物を作る必要があります。 ハードディスクをまるごとクローンコピーするなら、クローンコピーツールの実行だけで良いが、ファイル個別にコピーする場合は、最初にディスクのフォーマットが必要というのと似てますね。
sequelanonymous

2019/03/21 03:26

> もう少し一般的・抽象的に書くと、構造を持ったデータを変数に持ちたい場合、構造まるごと代入するならその一度の代入のみで良いのですが、構造の中の各要素を個別に代入したい場合は、まず最初に、構造の入れ物を作る必要があります。 徐々に腑に落ちてきました。ありがとうございます。 ーーーー ちなみにですが、 a = [] a = foo(a).bar() を a = df_results.values.tolist() a = foo(a).bar() と書くとおかしい理由はなんでしょうか?
otn

2019/03/21 03:35

その2行だけ単独に見るととくにおかしい理由はありません。 普通は、 a = foo(df_results.values.tolist()).bar() と、1行で書きますが、2行に分けて書いて駄目というほどではないです。 強いて駄目な点を挙げれば、aという変数名でなく意味のある名前を付けようとした途端に、困ります。 a=2 print(a*3+1) a="hello" print(a, "Taro") と、異なる意味のデータに対して、同じ名前のaを使うのがおかしいのと同じ理由。
sequelanonymous

2019/03/21 04:24

> 異なる意味のデータに対して... そう言う場合に、a=“hello”の前でaを空文字初期化するか、aを違う変数名に変えるかで解決できる、と言う理解であっていますでしょうか?
otn

2019/03/21 04:27 編集

> a=“hello”の前でaを空文字初期化するか、 それは無意味です。今までの私の回答が理解できていませんね。 > aを違う変数名に変えるかで解決できる、 変数名はその意味を表したものにすべきという観点ではそうですね。aという名前だと意味不明です。
sequelanonymous

2019/03/21 04:39

失礼しました、そうでした、わたしの頭がごちゃごちゃになっていました。 そうすると、a=[]と言う記述をpythonで書く機会ははほぼ無いと思えてきたのですがどう思いますでしょうか? 箱を用意するのは、値を入れるためであって、だったら最初から値を入れるので、わざわざ空のものを作る必要がないと思いました。
otn

2019/03/21 04:50

その直後に「a=何か」があるなら、その直前の a=[] は無意味です。 a = [] a.append("A") a.append("B") というのは、2,3行目はa への代入ではないので、今回の話とは関係ありません。このあたりとごっちゃになっているのでは?
sequelanonymous

2019/03/21 12:27

はい、おっしゃる通りでした。そこと混在しておりました。 そう考えるとappend以外でa=[]を書くことはなさそうですね。a=[]を書く場合とそうでない場合が知りたかったことなのでそう質問を書けばよかったです。
guest

0

初期化せずに値をいれて使っているコードがありますが

これはどのようなコードなのでしょうか?

リストに限らず変数は初期化して使うのが基本になると思います。

投稿2019/03/20 23:02

nskydiving

総合スコア6500

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

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

sequelanonymous

2019/03/21 01:50

例えば、以下の様コードです。 sqlのqueryにバインドするパラメータをリストで渡したいときなどです。 -- # バインドパラメータ param_list = [ ("a", "STRING", a), ("b", "STRING",b), ("c", "STRING", c) ] # sqlで取得するデータセットのヘッダー header = ["a_id", "b_id", "c_id"] df_results = query.execute_query(query, param_list, header)
nskydiving

2019/03/21 02:14

提示していただいたコードの param_list、header、df_results は、いずれも変数の宣言と同時に値が代入されているので、初期化されていると言えます。 a = [] のように「空配列を代入すること」=「初期化」だと勘違いしていないでしょうか?
sequelanonymous

2019/03/21 02:21 編集

> a = [] のように「空配列を代入すること」=「初期化」だと勘違いしていないでしょうか? はい、ここは、私の認識があやふやでした。しかし、上記回答者さんの答えで明確になりました。 空文字初期化が必要ではないケースはなにか、というのが本来質問したかったことだったなとあとから思いました。 例えば、空文字初期化が必要なケースは以下のようなとき。おそらく、for文をつかうときとかは、空文字初期化が必要な気がしています。ただ、それ以外でなにか空文字初期化をする必要、もしくはしなくていい場合というのは、どんなときがあるのか、が気になっています。 a = [1,2,3,4,5] # aというリストの中身をコピーしたbというリストを作った(つもり) b = a # 後からa[2]の値を変更した(つもり) a[2] = 5 print(a) print(b) output [1, 2, 5, 4, 5] [1, 2, 5, 4, 5]
guest

0

リストの初期化が必要ない、ではなく、どっかからやってくる値で初期化している、だけですね

投稿2019/03/20 23:00

y_waiwai

総合スコア88163

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

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

sequelanonymous

2019/03/21 01:52

> どっかからやってくる値で初期化している ありがとうございます。上記のコメントの詳細が気になります。 どっかからやってくる値で初期化している、というのはどういうイメージでしょうか? a = [] をかかず、いきなり値を代入してa = [1,2,3]というようなコードで初期化がされたということになる、という意味でしょうか?
y_waiwai

2019/03/21 02:10

あなたが提示している a = df_results.values.tolist() というコードを例にしますと、 a という変数は、df_results.values.tolist()の結果で初期化されている、とも言えます その前の a = [] は不要です(これも、aを空のlistで初期化されてるってことですが)
y_waiwai

2019/03/21 02:14

あんまし、「初期化」という言葉にこだわる必要はありません。 あくまで値の代入です。 いいかえると、変数は、なんらかの値を代入しないと使用できません #変数は、なんらかの値で初期化しないと使えません、ってのと同じこと
sequelanonymous

2019/03/21 02:14

わかりやすくありがとうございます。 ただ、どういう場合だったら、空文字初期化をしなくていいのか、が気になっています。 つまり、初回に代入するものが空ではなく、値でいい理由が気になっています。
y_waiwai

2019/03/21 03:08 編集

変数は値を代入しないと使えない、と書きました。 foo(a) と関数呼び出しする場合、a にはあらかじめ値を代入しておかないとダメです foo関数の引数が list である場合は a=[] foo(a) とする必要があります
sequelanonymous

2019/03/21 03:12

下記コードのs=[]のsはなんでしょうか?どこからきて何につかわれるものでしょうか? s=[] foo(a)
y_waiwai

2019/03/21 03:20

ああ、それは a=[] の間違いです すぐに修正したんですがw
sequelanonymous

2019/03/21 03:29 編集

ありがとうございます。 a=[] foo(a) は、 a= [1,2,3] foo(a) と書けないのはなぜでしょうか?
y_waiwai

2019/03/21 03:39

別にそう書いてもいいです まあ、そこらへんはfooの内容の問題ですが、たとえばfooは、なんらかのリストをa に入れて返す、というものである場合は、 a=[1,2,3] とか入れて渡しても無駄なだけです fooという関数は、a に何かのリストを追加して返す、というのならそれはそれで意味があるでしょうし
sequelanonymous

2019/03/21 04:17

ありがとうございます、ここの部分も再確認したかったところでした。 また、 > まあ、そこらへんはfooの内容の問題です どう言う場合、問題になりそうでしょうか?ここが一番気になってるところであります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問