1

理論の質問

すべてのPythonシェルには、True、False、 ""、[]、{}、および整数と浮動小数点数の任意の組み合わせなど、宣言または作成せずに使用できるオブジェクトがあります。

これは、いつでもIDを取得できることを意味します。

id(1)
id(42)
id('')

もちろん、宣言されていないオブジェクトのIDを取得しようとすると、次のようになります。

id(myobject1)

Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    id(myobject1)
NameError: name 'myobject1' is not defined

myobject1は何も指していないため、定義されておらず、IDもありません。

しかし、記数法は無限であるため、宣言なしで使用できるオブジェクトは無限にあります。したがって、宣言されていないすべてのオブジェクトが、プログラム内のある容量で使用される前にIDを持つことは不可能です。

これらのオブジェクトにはいつIDが割り当てられますか?

4

3 に答える 3

2

あなたは割り当ての概念を誤解しています。

割り当てでは、オブジェクトを名前にバインドします。割り当てられているすべての名前は、任意の方法で使用できます。割り当てられていない名前は存在しないため、何も指すことができません(「どこにも」を含む)。

を指すid(spam)オブジェクトを要求し、次にそのIDを要求します。spam

存在しない名前spamには、IDを照会できるオブジェクトが割り当てられていません。

OTOH、すべてのオブジェクトにはIDがあります。

于 2012-12-13T15:45:14.703 に答える
2

誤解に一つずつ対抗していきます。それは役に立つかもしれないし、役に立たないかもしれません。

すべてのPythonシェルには、宣言せずに使用できるオブジェクトがあります

Pythonにはオブジェクトを「宣言する」という概念はありません。したがって、オブジェクトは宣言も非宣言もされません。

または作成された

作成されていないオブジェクトは使用できません。存在するすべてのオブジェクトにはIDがあります。

真/偽

TrueおよびFalseは存在するオブジェクトです。IDがあります。

""、[]、{}、および整数と浮動小数点数の任意の組み合わせ。

コードが実行されると、リテラルはオブジェクトになります。文字の組み合わせ{}は、本質的には言うためのショートカットですdict()。作成されたオブジェクトにはIDがあります。

もちろん、宣言されていないオブジェクトのIDを取得しようとすると、NameErrorが発生します。

いいえ。NameErrorは、定義されていない名前を使用しようとしている場合です。

myobject1は何も指していないので

間違って、それは「何も指さない」わけではありません。定義されていません。それは何も指し示すことはできません、それは存在しません。

IDはありません。

名前にはIDがありません。オブジェクトにはIDがあります。あなたが言う時

>>> foo = 5
>>> id(foo)
137396064

名前のIDを要求していませんfoo。fooという名前が割り当てられているオブジェクトのIDを要求しています。ここでfooを再割り当てすると、別のIDが取得されます。

>>> bar = foo
>>> foo = "string"
>>> id(foo)
3075254336
>>> id(bar)
137396064

オブジェクトのIDは同じままで、名前が再割り当てされています。

それでも、宣言なしで使用できるオブジェクトは無数にあります

いいえそうではありません。

于 2012-12-13T16:08:14.277 に答える
0

いつIDが割り当てられるかについての質問42:あなたはであると考えることができ42ますint(42)。値42の整数にメモリを割り当てます。整数が作成された後、id()関数に渡されます。その後、整数の参照カウントがデクリメントされるため、割り当てが解除されます。

技術的には、オブジェクトのIDは、メモリ内のそのアドレスに他なりません。

于 2012-12-13T16:10:02.717 に答える