3 回答

TA貢獻1840條經驗 獲得超5個贊
由于Python程序員通常不會說
將值None賦給變量是將其重置為其原始的空狀態的一種方法。
很難以一種有意義的方式解釋布里格斯的意思,并解釋為什么這里沒有人對此感到滿意。一個類推可能會有所幫助:
在Python中,變量名稱就像貼在對象上的標簽一樣。每個標簽上都有一個唯一的名稱,并且一次只能在一個對象上,但是如果需要,您可以在同一對象上放置多個標簽。當你寫
F = "fork"
您將標簽“ F”放在字符串對象上"fork"。如果你再寫
F = None
您將貼紙移動到None對象。
Briggs想讓您想象的是,您沒有寫貼紙"F",而是已經在F貼紙上了None,您所做的就是將其從None移到"fork"。因此F = None,如果我們決定將其None視為,則在鍵入時,您會將其“重置為原始的空狀態” empty state。
我可以看到他的意思,但這是一種不好的觀察方式。如果啟動Python并輸入print(F),則會看到
>>> print(F)
Traceback (most recent call last):
? File "<stdin>", line 1, in <module>
NameError: name 'F' is not defined
這NameError意味著Python無法識別這個名字F,因為沒有這樣的標簽。如果Briggs是正確的并且F = None重置F為其原始狀態,那么它應該現在就在那,我們應該看到
>>> print(F)
None
就像我們在鍵入F = None并貼上貼紙后所做的那樣None。
這就是所有的事情。實際上,Python附帶了一些已經粘貼到對象上的標簽(內置名稱),但是其他一些標簽則需要使用諸如F = "fork"and A = 2和這樣的行來編寫c17 = 3.14,然后再將它們粘貼到其他對象上(例如F = 10or F = None;它們都是一樣的) )
Briggs假裝您可能要寫的所有可能的貼紙都已粘貼到該None對象上。

TA貢獻1818條經驗 獲得超8個贊
None只是通常用于表示“空”或“此處無值”的值。它是一個信號對象 ; 它僅具有含義,因為Python文檔說明了它的含義。
在給定的Python解釋器會話中,該對象只有一個副本。
例如,如果您編寫一個函數,但該函數未使用顯式return語句,None則返回該函數。這樣,使用函數進行編程就大大簡化了;一個函數總是返回某些東西,即使它只是那個None對象。
您可以明確地對其進行測試:
if foo is None:
# foo is set to None
if bar is not None:
# bar is set to something *other* than None
另一個用途是為函數提供可選參數,默認為“空”:
def spam(foo=None):
if foo is not None:
# foo was specified, do something clever!
該函數spam()有一個可選參數。如果您在spam()未指定的情況下進行調用,則會為其指定默認值None,從而易于檢測是否使用參數調用了該函數。
其他語言也有類似的概念。SQL有NULL; JavaScript具有undefined 和 null,等等。
請注意,在Python中,變量通過使用而存在。您無需先聲明變量,因此Python 中沒有真正的空變量。那么,將變量設置None為與將其設置為默認的空值是不同的。None也是一個值,盡管該值通常用于表示空白。您正在閱讀的書在這一點上具有誤導性。

TA貢獻1773條經驗 獲得超3個贊
這是Python文檔必須說的None:
types.NoneType的唯一值。當沒有將默認參數傳遞給函數時,通常不使用None來表示缺少值。
在版本2.4中更改:分配為None是非法的,并引發SyntaxError。
注意不能重新分配名稱None和debug(分配給它們,即使作為屬性名稱也會引發SyntaxError),因此可以將它們視為“ true”常量。
讓我們確認None第一個的類型
print type(None)
print None.__class__
輸出量
<type 'NoneType'>
<type 'NoneType'>
基本上,NoneType數據類型類似于int,float等等。您可以在8.15中查看Python中可用的默認類型列表。types —內置類型的名稱。
并且,None是NoneType類的實例。因此,我們可能要創建None自己的實例。讓我們嘗試一下
print types.IntType()
print types.NoneType()
輸出量
0
TypeError: cannot create 'NoneType' instances
很明顯,無法創建NoneType實例。我們不必擔心價值的獨特性None。
讓我們檢查一下我們是如何None內部實現的。
print dir(None)
輸出量
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
除了__setattr__,所有其他均為只讀屬性。因此,我們無法更改的屬性None。
讓我們嘗試為添加新屬性 None
setattr(types.NoneType, 'somefield', 'somevalue')
setattr(None, 'somefield', 'somevalue')
None.somefield = 'somevalue'
輸出量
TypeError: can't set attributes of built-in/extension type 'NoneType'
AttributeError: 'NoneType' object has no attribute 'somefield'
AttributeError: 'NoneType' object has no attribute 'somefield'
上面看到的語句分別產生這些錯誤消息。這意味著我們不能在None實例上動態創建屬性。
讓我們檢查一下分配東西時會發生什么None。根據文檔,它應該拋出SyntaxError。這意味著,如果我們向分配某些內容None,則該程序將完全不會執行。
None = 1
輸出量
SyntaxError: cannot assign to None
我們已經確定
None 是...的實例 NoneType
None 不能有新屬性
的現有屬性None無法更改。
我們無法創建的其他實例 NoneType
我們甚至不能通過None給它分配值來更改對它的引用。
因此,如文檔中所述,None可以真正將其視為true constant。
很高興知道None:)
添加回答
舉報