私はPythonを研究しており、None
の値を説明する章を読みましたが、残念ながらこの本はいくつかの点であまり明確ではありません。そこで質問を共有すれば、自分の質問に対する答えが見つかると思いました。
None
の値isが何で、何に使用するのか知りたいのですが。
また、私は本のこの部分を取得しません:
None
の値を変数に割り当てることは、変数を元の空の状態にリセットする1つの方法です。
どういう意味ですか?
答えは素晴らしかったが、コンピューターの世界に対する知識が低いため、ほとんどの答えを理解できなかった(クラス、オブジェクトなどについては学んだことがない)。この文はどういう意味ですか?
None
の値を変数に割り当てることは、変数を元の空の状態にリセットする1つの方法です。
最後の:
最後に、さまざまな答えを見ることで、答えが得られました。私を助けてくれたすべての人々(特にMartijn PietersとDSM)に感謝しなければなりません。すべての回答を最高のものとして選択できることを望みますが、選択は1つに限定されます。すべての答えは素晴らしかった。
Martijnの答えは、PythonでNone
が何であるかを説明し、この本が誤解を招くと正しく述べています。 Pythonプログラマーは原則として決して言うことはないので
None
の値を変数に割り当てることは、変数を元の空の状態にリセットする1つの方法です。
ブリッグスの意味を理にかなって説明し、なぜここに誰もそれに満足していないのかを説明するのは難しい。役立つかもしれない1つの類推:
Pythonでは、変数名はオブジェクトに貼られたステッカーのようなものです。すべてのステッカーには一意の名前が書かれており、一度に1つのオブジェクトにしか貼ることができませんが、同じオブジェクトに複数のステッカーを貼ることもできます。書くとき
F = "fork"
文字列オブジェクト"fork"
にステッカー「F」を貼り付けます。次に書く場合
F = None
ステッカーをNone
オブジェクトに移動します。
Briggsがあなたに想像して欲しいのは、あなたがwriteステッカー"F"
ではなく、alreadyF
ステッカーのNone
で、あなたがしたことはmove itで、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"
やA = 2
やc17 = 3.14
のような行で自分で書く必要があります。後で(F = 10
やF = None
のように、すべて同じです。)
ブリッグスは、あなたが書きたいかもしれないすべてのステッカーがすでにNone
オブジェクトに貼り付けられているふりをしています。
None
は、「空」または「値なし」を示すために一般的に使用される単なる値です。それは信号オブジェクトです; Pythonのドキュメントにはその意味があると書かれているため、意味があります。
特定のPythonインタープリターセッションには、そのオブジェクトのコピーは1つしかありません。
関数を作成し、その関数が明示的なreturn
ステートメントを使用しない場合、たとえば、代わりにNone
が返されます。これにより、関数を使用したプログラミングが大幅に簡素化されます。関数alwaysは、1つのNone
オブジェクトだけであっても、somethingを返します。
明示的にテストできます:
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
ANDnull
などがあります。
Pythonでは、変数は使用されるために存在することに注意してください。最初に変数を宣言する必要はないので、Pythonには実際にはempty変数はありません。変数をNone
に設定することは、デフォルトの空の値に設定することとは異なります。 None
も値です。ただし、signalemptynessによく使用されます。あなたが読んでいる本は、その点で誤解を招きます。
これは、 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
などと同様のデータ型です。Pythonで使用可能なデフォルトの型のリストは、8.15。 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
を知って幸せ:)
本 あなたが参照するのは、明らかにNone
name__の意味を単純化するしようとしていることです。 Python変数は、初期の空の状態を持たないはありません– Python変数は 定義されている場合のみ(バインドされている) です。 Python変数は、値を指定せずに作成することはできません。
>>> print(x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> def test(x):
... print(x)
...
>>> test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: test() takes exactly 1 argument (0 given)
>>> def test():
... print(x)
...
>>> test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in test
NameError: global name 'x' is not defined
ただし、変数が定義されているかどうかによって関数の意味を変えたい場合があります。 None
name__のデフォルト値を使用して引数を作成できます。
>>> def test(x=None):
... if x is None:
... print('no x here')
... else:
... print(x)
...
>>> test()
no x here
>>> test('x!')
x!
この場合、この値が特別なNone
name__値であることはそれほど重要ではありません。デフォルト値を使用できました。
>>> def test(x=-1):
... if x == -1:
... print('no x here')
... else:
... print(x)
...
>>> test()
no x here
>>> test('x!')
x!
…ただし、None
name__を使用すると、2つの利点が得られます。
-1
のような特別な値を選択する必要はありません。-1
を通常の入力として処理する必要がある場合があります。>>> test(-1)
no x here
おっとっと!
そのため、この本は主にWordresetの使用において少し誤解を招きます。None
name__を名前に割り当てることは、その値がそうでないというプログラマーへの合図です。 tが使用されているか、関数がデフォルトの方法で動作する必要がありますが、値を元の未定義の状態にresetするには、del
name__キーワードを使用する必要があります。
>>> x = 3
>>> x
3
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
他の答えはすでにNoneの意味を美しく説明しています。ただし、例を使用してこれについてさらに説明します。
例:
def extendList(val, list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3
次に、上記のリストの出力を推測してみてください。さて、答えは驚くほど以下の通りです:
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
しかし、なぜ?
多くは、list1が[10]およびlist3['a']と等しい、リストは引数は、extendListが呼び出されるたびに、デフォルト値の[]に設定されます。
ただし、実際に行われるのは、関数が定義されたときに新しいデフォルトリストが1回だけ作成されるであり、リスト引数を指定せずにextendListが呼び出されるたびに同じリストが使用されます。これは、デフォルト引数の式は、関数の呼び出し時ではなく定義時に計算されるであるためです。
したがって、list1およびlist3は同じデフォルトリストで動作しますが、list2は、独自の空のリストをlistパラメーターの値として渡すことにより、作成した別のリストを操作しています。
「なし」の救世主:(上記の例を修正して、望ましい動作を実現します)
def extendList(val, list=None):
if list is None:
list = []
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3
この修正された実装では、出力は次のようになります。
list1 = [10]
list2 = [123]
list3 = ['a']
注-toptal.comへのクレジットの例
Noneは、他の値が存在しないことを表すために言語とライブラリの多くの場所で使用されるシングルトンオブジェクトです(Noneが1つしかないことを意味します)。
例:d
が辞書の場合、d.get(k)
はd[k]
を返しますが、None
にキーd
がない場合はk
を返します。
すばらしいブログからこの情報を読んでください: http://python-history.blogspot.in/
コード例(およびフルーツ)が大好きなので、見せましょう
Apple = "Apple"
print(Apple)
>>> Apple
apple = None
print(Apple)
>>> None
なしは何も意味せず、値はありません。
Falseと評価されるものはありません。