這是什麼意思「在Python中,所有文字值都會導致對象的創建」?在Python中,所有文字值導致創建對象
我學習Python中,並從這裏得到了這樣一句話: http://python4java.necaiseweb.org/Fundamentals/FunctionsAndMethods
但我並沒有真正理解其含義。
首先,「字面值」是什麼?
二,請解釋一下這句話。
如果你可以舉一些例子,那會很有幫助!
這是什麼意思「在Python中,所有文字值都會導致對象的創建」?在Python中,所有文字值導致創建對象
我學習Python中,並從這裏得到了這樣一句話: http://python4java.necaiseweb.org/Fundamentals/FunctionsAndMethods
但我並沒有真正理解其含義。
首先,「字面值」是什麼?
二,請解釋一下這句話。
如果你可以舉一些例子,那會很有幫助!
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
對象或不同的對象,因爲缺少is
和id
,沒有辦法區分。對於琴絃,花車等也是如此。
以下是文字值的例子
>>> 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
這意味着當您鍵入任何值如1234
,67.2
或"this is a string"
,它作爲一個對象來處理。
一個真正學習Python偉大的方式是交互式解釋器(通常是在你的shell中鍵入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...
我認爲它說,在Python中,一切都是一個對象。 – Blender
@Blender這不完全等價。 –
@Lattyware:我不認爲所有*文字值都會導致創建一個對象(如果我沒有記錯的話,Python會在啓動時爲前256個整數創建對象)。你會怎麼做? – Blender