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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1089閲覧

gcの到達不能オブジェクトってどういう意味ですか?

kenmero

総合スコア30

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/19 04:56

タイトルのまんまです。
外部からデータを受け取るときに、メモリ不足により処理しきれなくなった
オブジェクトのことを”到達不能オブジェクト”と言っているのでしょうか?

イメージがあまりわかなく、もやもやです。。。
誰かスッキリ!!させてください<(_ _)>

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

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

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

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

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

guest

回答3

0

Python

1 words = ['cat', 'window', 'defenestrate'] 2 for w in words: 3 print(w, len(w))

for で出てくる w は、for 文(の中)でしかアクセスできません。
この for 文が終わった時点で、w に対してはアクセスできなくなります。

こういう「もう参照される方法のない」オブジェクトを到達不能オブジェクトとして扱い、
定期的、あるいはメモリ不足になったときなどに、この到達不能オブジェクトが占めている領域を開放するのが、基本的な gc の考え方です。

投稿2019/04/19 05:13

tacsheaven

総合スコア13703

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

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

kenmero

2019/04/19 05:15

ありがとうございます! 例までだしてくれて、すぐイメージできました!!!
otn

2019/04/19 06:02

この例は不適切では? wが指すオブジェクトは、words[0]、words[1]、words[2] 自身であり、これは変数wordsがそのリストをポイントしている間は生きているのでは? (文字列の場合はオブジェクトの複製が発生する???)
argparse

2019/04/19 07:34

Python の変数スコープは関数単位であってブロック単位ではないので、抑々 `for` の外でも `w` には普通にアクセス可能である (ループ最後の値を保持している) 、という問題も御座いますね。まあ、ふいんきが知りたいという問いなので、疑似コードだと考えればギリギリ良いのかもしれませんが。
tacsheaven

2019/04/19 08:37

確かに python だとそうなりますかね……まあ python は例で、ということで(他の言語だとこうなりますし) w が指すオブジェクトは生きていますが、w そのものは死んでる(他の言語なら)、ってことで。
guest

0

ベストアンサー

どの変数からポインタを辿っても辿り着かないオブジェクトの事です。
言い換えると、どこからも参照されていないオブジェクトの事です。
つまり、今後絶対に使われる事がないオブジェクトの事です。

投稿2019/04/19 04:59

otn

総合スコア84423

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

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

kenmero

2019/04/19 05:14

誰からも参照されていない = 到達不能 ということですか ありがとうございます!スッキリしました!!
guest

0

ざっくりした説明ですが。

python

1>>> a = [1,2,3] 2>>> a[1] 32 4>>> b = a[2] 5>>> a = a[0:1] 6>>> a[1] 7Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9IndexError: list index out of range 10>>> b 113

a を定義した直後であれば、 a[1] とすれば 2 という値に到達できますが、 
a を更新してしまうと 2 という値に到達する方法がもうなくなりましたよね?
でも、メモリ上は領域を確保しています。これを到達不能オブジェクトと言います。

一方、a からは参照できなくても b という変数で参照が確保できている場合は到達可能です。

投稿2019/04/19 05:16

mather

総合スコア6753

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

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

kenmero

2019/04/19 05:34

ありがとうございます! 変数名の再利用するために、上書きとか普通におこなってるんですけど、 その場合、元々格納されていた値は、 消えずにメモリ上に残っちゃっているという認識であっていますか? gcを有効にさせていれば、あまり気にしなくてもいいかもしれませんが、 同じ変数の使い回しはあまりよろしくないのでしょうか?
mather

2019/04/19 05:40

使い回しが良くないと言うわけではないのですが、下手に節約しようとプログラマが頑張ることでバグを招くほうが怖いです。 原則として変数は目的を持って命名するべきですし、途中から別の用途で使うのは避けるべきです。 また、変数をずーっと使うのではなく、利用される関数やクラスなどの規模(スコープ)で必要な変数のみを扱うべきです。 より詳しいことは「リーダブルコード」など有名な本を参考にしてみてはいかがでしょうか。
kenmero

2019/04/19 07:36

返事遅れて申し訳ありません。 ご回答ありがとうございます! スコープを意識して変数を命名したことがなかったので、 勉強になります! リーダブルコードですね!読んでみます!! 図書館にあるかしら・・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問