2013-04-12 55 views
2

這是什麼意思「在Python中,所有文字值都會導致對象的創建」?在Python中,所有文字值導致創建對象

我學習Python中,並從這裏得到了這樣一句話: http://python4java.necaiseweb.org/Fundamentals/FunctionsAndMethods

但我並沒有真正理解其含義。

首先,「字面值」是什麼?

二,請解釋一下這句話。

如果你可以舉一些例子,那會很有幫助!

+1

我認爲它說,在Python中,一切都是一個對象。 – Blender

+0

@Blender這不完全等價。 –

+0

@Lattyware:我不認爲所有*文字值都會導致創建一個對象(如果我沒有記錯的話,Python會在啓動時爲前256個整數創建對象)。你會怎麼做? – Blender

回答

3

Python在不同的上下文中實際上對「literal」有幾個定義,但是如果你只是想要基本思想:像123這樣的數字和像​​這樣的字符串是文字;像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] 

(不要問列表顯示是否也是文字,因爲這是在「爲不同的C不同的定義ontexts」其實重要的......)


值得指出的是,這不是真的,‘所有的文字值導致創建對象’。一個文字可能是一個新的對象,但它也可能是一個對現有對象具有相同值的引用。例如:

>>> a = 3 
>>> b = 3 
>>> a is b 
True 
>>> id(a) == id(b) 
True 

(這不是保證由語言是真實的,但它通常會在大多數Python實現)。

所以,b = 3並未導致創建一個對象,只是對a = 3中同一對象的另一個引用。 (實際上,3最有可能已經預先構建,並在解釋器預先緩存,甚至在查看您的代碼之前。)

但是您不需要關心此問題,因爲3是不可變的。不要緊,如果你得到相同的3對象或不同的對象,因爲缺少isid,沒有辦法區分。對於琴絃,花車等也是如此。

2

以下是文字值的例子

>>> 0 
0 
>>> 'a' 
'a' 
>>> 1.9 
1.9 
>>> 'foo' 
'foo' 

一切都是對象,甚至int S,如下圖所示,你可以看到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 
2

這意味着當您鍵入任何值如123467.2"this is a string",它作爲一個對象來處理。

2

一個真正學習Python偉大的方式是交互式解釋器(通常是在你的shell中鍵入Python找到。)

一旦你做到這一點,使用_typedir,並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...