これは、「Python では、すべてのリテラル値によってオブジェクトが作成される」という意味ですか?
私はPythonを学んでおり、ここからこの文を入手しました: http://python4java.necaiseweb.org/Fundamentals/FunctionsAndMethods
しかし、私はその意味をよく理解していません。
まず、「リテラル値」とは何ですか?
次に、この文を説明してください。
例を挙げていただけると助かります!
これは、「Python では、すべてのリテラル値によってオブジェクトが作成される」という意味ですか?
私はPythonを学んでおり、ここからこの文を入手しました: http://python4java.necaiseweb.org/Fundamentals/FunctionsAndMethods
しかし、私はその意味をよく理解していません。
まず、「リテラル値」とは何ですか?
次に、この文を説明してください。
例を挙げていただけると助かります!
123
Python には、実際にはさまざまなコンテキストで「リテラル」の定義がいくつかありますが、基本的な考え方だけが必要な場合"abc"
: のような表現123 + 456
はありません。
Java で を記述する123
と、それは Java オブジェクトへの参照ではなく、「ネイティブ」整数です。Python では、Python オブジェクトへの参照です。
Python ではすべてがオブジェクトであるため、整数にはメソッドがあり、コレクションなどにスタックできます。「ボックス化」と「ボックス化解除」はどこにもありません。123
リストに固執したい場合は、次のようにします。
>>> my_list = list()
>>> my_list.append(123)
>>> my_list
[123]
リストの値を整数として使用する場合は、次のようにします。
>>> my_list[0] - 120
3
さらに言えば、他のオブジェクトと同じようにリテラルを使用して、リスト表示を記述できます。
>>> my_other_list = [my_list, 2]
(リスト表示もリテラルかどうかを尋ねないでください。「異なるコンテキストの異なる定義」が実際に重要になるのはそのためです…)
「すべてのリテラル値がオブジェクトの作成につながる」というのは本当ではないことを指摘する価値があります。リテラルは新しいオブジェクトの場合もありますが、同じ値を持つ既存のオブジェクトへの参照の場合もあります。例えば:
>>> a = 3
>>> b = 3
>>> a is b
True
>>> id(a) == id(b)
True
(これは言語によって真であるとは限りませんが、通常、ほとんどの Python 実装ではそうです。)
そのb = 3
ため、オブジェクトの作成には至らず、同じオブジェクトへの別の参照がa = 3
. (実際、3
コードを見る前に、インタープリターによって既に事前にビルドされ、事前にキャッシュされている可能性が高いです。)
3
しかし、は不変であるため、これを気にする必要はありません。同じ3
オブジェクトを取得するか別のオブジェクトを取得するかは問題ではありません。なぜなら、is
とがなければid
、違いを見分ける方法がないからです。文字列、フロートなどについても同じことが言えます。
Python を学習するための本当に優れた方法は、対話型インタープリターを使用することです (通常Python
、シェルで入力すると見つかります)。
これを行ったら、、、、およびを使用して、次の_
ようにオブジェクト タイプと情報を確認します。type
dir
help
>>> 4 # a literal 4
4
>>> type(_) # what is the type of the last object?
<type 'int'> # int
>>> dir(int) # what methods does it have?
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> help(int)
... bunch of help text on int class ...
>>> type(4.4)
<type 'float'>
# do the same interview of Python to tell you about the float class...
以下は、リテラル値の例です
>>> 0
0
>>> 'a'
'a'
>>> 1.9
1.9
>>> 'foo'
'foo'
以下に示すようint
に、 のメソッドを確認できます0
。
>>> dir(0)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
私が望むなら、私は電話することができます:
>>> (-1).__abs__() # abs(-1) is better but this is just to show it's an object
1
1234
、67.2
、またはのような値を入力する"this is a string"
と、オブジェクトとして処理されることを意味します。