プログラミング初心者です。
例えば,C言語などで動的にメモリを確保した場合はfreeしないとどんどんメモリが食われていくという話を先生に聞きました。
pythonでは動的,または普通に変数を宣言したときはこのような処理は必要でしょうか。
環境はjupyter notebook です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
まず前提として、変数の作成それ自体はメモリ領域を消費しません。
(厳密には若干異なりますが、単純化して言うとそうです)
python
1a = [1, 2, "hoge"] # [1, 2, "hoge"]の分だけメモリを消費する 2b = a # これは新たなメモリ消費を生じない。bはaが参照しているのと同じものを参照
Cでいう、mallocして値を初期化して……という処理が[1, 2, "hoge"]
と書くことで一気に行われて(listなので各要素がそれぞれ生成されてから外側のlistが生成されますが)、そのアドレスが変数a
と関連付けられるとみなしてとりあえずは構いません。
(実際は変数はCでいうポインタ型変数ではなく、シンボルテーブルのハッシュテーブルのキーになる文字列)
Pythonでは動的メモリ確保は行われますが、free
を明示的に行う必要はありません。ガベージコレクタというものが言語処理系の機能として実装されています。
どういうことかというと、以下のような例がわかりやすいでしょうか。
python
1a = "fuga" # "fuga"が生成されてaに代入される 2a = "piyo" # aに"piyo"を代入すると"fuga"にアクセスする手段はなくなる
二行目の時点で"fuga"は自動的にメモリ上から除去されます。これは他の値を代入することで副次的に起きる現象ですが、del文を使ってもう少し明示的に書くこともできます。
python
1a = "fuga" 2del a # aという変数は使えなくなる
del
文はこの場合オブジェクトを消すのではなく、変数を消すだけだということに注意してください。
python
1a = "fuga" 2b = a 3del a 4# aにはアクセスできないがbにはできるし、"fuga"もメモリ上に残る
端的に言うと、プログラムからアクセスする手段がなくなった(変数やオブジェクトの属性、コンテナの中身などからたどり着けなくなった)オブジェクトは消えます。不要なものは消してくれる訳です。
逆に言うと、プログラムからアクセスする手段が残っていればオブジェクトは未来永劫残り続けます。C言語などでいうメモリリークとは異なる現象ですが、これが原因で結果的にメモリが足りなくなる可能性は皆無ではありません(普通に書いて使う分には気にしなくて良いですが)。
投稿2019/11/03 03:51
編集2019/11/03 08:01総合スコア30935
0
pythonでは動的,または普通に変数を宣言したときはこのような処理は必要でしょうか。
Pythonにはガベージコレクションが組み込まれていますので、使わなくなった変数は放置していても参照不能となった時点で自動でメモリが開放されます。手動操作は不要です。
投稿2019/11/03 03:23
総合スコア145967
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
- 【Python入門】メモリの解放や効率的に使う方法をマスターしよう!
https://www.sejuku.net/blog/74447
...
PythonにはGC(ガベージコレクション)の機能があるため、メモリ開放はC言語などのように手動で実施することなく、大抵はGCが自動で行ってくれます。そのため普段はメモリについて大きく意識することなくプログラミングの処理を書くことに専念できるのです!しかし大量のデータを扱う場合やメモリ制限のある環境では、GCの判断で開放を行うのではなく、必要なくなったタイミングで即座に開放したい場合も出てきます。
...
コンピュータの資源には、メモリー以外に、ファイルもあります。
ファイルを rews/wrie するために ファイルを open します。
ファイルの close は python でも、自動では行ってくれません。
したがって、 file を open して close をし忘れているという処理をループさせていたりすると、途中でエラーになってしまいます。
投稿2019/11/03 04:53
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。