これが原因tuple
オブジェクト(と私はかなり確信している文字列から除くすべてのコンテナが)の大きさを算出することで、むしろ、それぞれの内容の実際のサイズを含むことにより、そのサイズないを評価するが、という事実によるものであり、 PyObject
へのポインタに含まれる要素の倍数。つまり、(generic)PyObject
へのポインタを保持しており、それがその全体のサイズに寄与しています。
これはData Model chapter of the Python Referenceマニュアルで示唆されています
一部のオブジェクトが他のオブジェクトへの参照を含まれています。これらはコンテナと呼ばれます。コンテナの例はタプル、リスト、辞書です。参照はコンテナの値の一部です。
(。私は言葉の参照を強調しています)
In PyTupleType
、tuple
タイプに関する情報が含まれている構造体を、我々はtp_itemsize
フィールドは、その値としてsizeof(PyObject *)
を持っていることを参照してください。
PyTypeObject PyTuple_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"tuple",
sizeof(PyTupleObject) - sizeof(PyObject *),
sizeof(PyObject *), // <-- sizeof pointer to PyObject's
32
ビットを構築しsizeof(PyObject *)
を有する64
ビットは、Pythonのビルド8バイトに等しい。
これは、tuple
インスタンスに含まれるアイテムの数で乗算される値です。私たちはobject_size
を見てみると、tuple
sが(object.__sizeof__ is tuple.__sizeof__
を調べる)object
から継承__sizeof__
方法は、我々は明らかに、これを参照してください。
static PyObject *
object_sizeof(PyObject *self, PyObject *args)
{
Py_ssize_t res, isize;
res = 0;
isize = self->ob_type->tp_itemsize;
if (isize > 0)
res = Py_SIZE(self) * isize; // <-- num_elements * tp_itemsize
res += self->ob_type->tp_basicsize;
return PyLong_FromSsize_t(res);
}
は他のマクロである、Py_SIZE(self)
を乗じてどのようisize
(tp_itemsize
から入手)を参照してくださいob_size
値をつかみ、の中にある要素の数がであることを示します。タプルのサイズ
t[0].__sizeof__() # 5169
:の大きさを持つその中
t = ("Hello" * 2 ** 10,)
要素を持つ:我々はタプルインスタンス内のやや大きな文字列を作成しても、なぜ、
です例:
t.__sizeof__() # 32
は、単純に"Hello"
のものと同じです。
t2 = ("Hello",)
t[0].__sizeof__() # 54
t2.__sizeof__() # 32 Tuple size stays the same.
文字列の場合、個々の文字はそれぞれstr.__sizeof__
から返される値を大きくします。これは、tuple
がポインタのみを格納するという事実と共に、"Hello"
がそれを含んでいるタプルよりも大きいという誤った印象を与えます。
完全性のために、これを計算するのはunicode__sizeof__
です。実際には、文字列の長さに文字サイズ(文字が1
、2
、および4
バイトの文字に依存する)を乗算するだけです。
タプルでは得られない唯一の理由は、基本サイズ(tb_basicsize
で示される)がsizeof(PyTupleObject) - sizeof(PyObject *)
と表示されている理由です。これは返される全体サイズから8
バイトを流します。私はこれについての説明はまだ見つけていない(まだ)。
最初のオブジェクトはタプルではなく、かっこ内の文字列です。 – Kasramvd