None値とは何ですか?


130

私はPythonを研究していて、そのNone値について説明している章を読みましたが、残念ながら、この本はいくつかの点であまり明確ではありません。そこで質問を共有すれば、答えが見つかると思いました。

None価値とは何か、それを何に使うのか知りたいですか

そしてまた、私は本のこの部分を取得しません:

変数に値を割り当てることはNone、変数を元の空の状態にリセットする1つの方法です。

どういう意味ですか?

答えは素晴らしかったですが、コンピュータの世界についての知識が低いため、ほとんどの回答を理解できませんでした(クラスやオブジェクトなどについてはまだ知りません)。この文はどういう意味ですか?

変数に値を割り当てることはNone、変数を元の空の状態にリセットする1つの方法です。

最後の:

最後に、私はさまざまな答えを探すことから私の答えを得ました。私を助けるために時間を費やしてくれたすべての人々(特にMartijn PietersとDSM)に感謝しなければなりません。すべての回答を最高のものとして選択できればいいのですが、選択は1つに制限されます。答えはすべて素晴らしかった。


39
その本はあまり役に立ちません。None変数のデフォルトの空の状態ではありません。
Martijn Pieters

私の頭の上にあるphpは、null値が変数のデフォルトの空の状態に相当する唯一の言語です。今、私は他の言語が何をしているのかと思っています。
kojiro

@kojiro perl。ただし、等価演算子はどちらもとの比較に満足していませんundef。間違いなくjavascriptですが、nullとの両方がありundefinedます。
Eevee

undefined初期化されていない場合、@ kojiro JavaScript変数のデフォルト値はです。
thefourtheye

ある右、異なるからnull、私は彼の答えで@MartijnPietersに作るために失敗してるポイント、。
kojiro

回答:


99

Martijnの答えNoneは、Pythonの内容を説明し、本が誤解を招くものであると正しく述べています。Pythonプログラマーは原則として、

変数に値を割り当てることはNone、変数を元の空の状態にリセットする1つの方法です。

ブリッグスが何を意味するのかを説明するのは難しく、なぜここに誰も満足していないのかを説明しています。助けるかもしれない一つの類推:

Pythonでは、変数名はオブジェクトに貼られるステッカーのようなものです。すべてのステッカーには一意の名前が書かれており、一度に1つのオブジェクトにのみ付けることができますが、必要に応じて、同じオブジェクトに複数のステッカーを付けることもできます。あなたが書くとき

F = "fork"

文字列オブジェクトにステッカー「F」を貼ります"fork"。次に書けば

F = None

ステッカーをNoneオブジェクトに移動します。

Briggsがあなたに想像するように求めているのは、あなたがステッカーを書いていないことすでににステッカー"F"があったこと、そしてあなたがしたのはそれをからに移動することだけです。したがって、と入力すると、意味があるものとして扱うことにした場合は、「元の空の状態にリセットする」ことになります。FNoneNone"fork"F = NoneNoneempty state

私は彼が何をしているのかを見ることができますが、それはそれを見るのに悪い方法です。Pythonを起動してと入力するとprint(F)

>>> print(F)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'F' is not defined

それはNameErrorPythonが名前を認識しないことを意味しFそのようなステッカーがないため。Briggsが正しく、元の状態にF = NoneリセットさFれた場合、それは今そこにあるはずです。

>>> print(F)
None

入力F = Noneしてステッカーを貼った後のようにNone


これで、これですべてです。実際には、Pythonには既にオブジェクトに組み込まれているステッカー(組み込みの名前)がいくつか付属していますが、andやのような行で自分で書く必要があるものF = "fork"A = 2c17 = 3.14後で他のオブジェクトにステッカーを貼り付けることもできます(F = 10またはのように、F = Noneすべて同じです) 。)

Briggsは、書きたいすべてのステッカーがすでにNoneオブジェクトに貼り付けられていると偽っています。


1
申し訳ありませんが、ブリッグスとはどういう意味ですか?この本の著者を指していますか?彼の名前はジェイソンRブリッグスだからです。
The_Diver 2013年

@The_Diver:うん、それは彼だ。
DSM

Pythonの組み込み名に関する詳細情報はどこにありますか?
The_Diver 2013年

3
これは、プログラマーでない人にとって素晴らしい説明です。どうもありがとうございました!
クリスティーナ

67

None「空」または「ここに値がない」ことを示すために一般的に使用される単なる値です。これはシグナルオブジェクトです。Pythonのドキュメントにはその意味があると書かれているため、意味があるだけです。

特定のPythonインタープリターセッションには、そのオブジェクトのコピーが1つしかありません。

たとえば、関数を記述し、その関数が明示的なreturnステートメントを使用しない場合は、None代わりにが返されます。これにより、関数を使用したプログラミングが大幅に簡略化されます。関数は、オブジェクトが1つだけであっても、常に何か返しNoneます。

あなたはそれを明示的にテストすることができます:

if foo is None:
    # foo is set to None

if bar is not None:
    # bar is set to something *other* than None

もう1つの使用法は、オプションのパラメーターを関数に '空の'デフォルトを与えることです。

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値は、多くの場合に使用されている1はいえ、あまりにもある信号空要素を基底として。あなたが読んでいる本はその点で誤解を招くものです。


1
のセマンティクスは、未定義のセマンティクスとは異なると思います。したがって、JavaScriptとSQLの対応が明確になっているかどうかはわかりません。問題を混乱させる可能性があります。JavaScriptは両方を持っているundefined null
kojiro

@kojiro:undefinedはJavaScriptのオブジェクトでありNone、Pythonで使用できるのと同じように、そのオブジェクトを明示的に使用できます。これはシグナルオブジェクトであり、ほぼ同じ意味です。
Martijn Pieters

@kojiro:SQLはプログラミング言語ではありませんが、NULL明示的に割り当ててテストできるものです。
Martijn Pieters

5
@MartijnPieters:SQL プログラミング言語であり、非常に具体的な目的であり、宣言型です。
danielkza 2013年

3
@daniel:プログラミング言語が長い議論であったためにSQLが適格であるかどうか... 興味深い角度については、stackoverflow.com / questions / 900055 /…を参照してください。
Martijn Pieters

23

これはPythonのドキュメントが言っていることNoneです:

types.NoneTypeの唯一の値。Noneは、デフォルトの引数が関数に渡されない場合など、値がないことを表すためによく使用されます。

バージョン2.4で変更:Noneへの代入は違法であり、SyntaxErrorを送出します。

注名前Noneおよびdebugは再割り当てできません(属性名としても割り当てられるため、SyntaxErrorが発生します)。したがって、これらは「真の」定数と見なすことができます。

  1. None最初のタイプを確認しましょう

    print type(None)
    print None.__class__

    出力

    <type 'NoneType'>
    <type 'NoneType'>

基本的には、NoneType同じようにデータ型であるintfloatあなたがして、Pythonで使用可能なデフォルトタイプのリストをチェックアウトすることができますなど、8.15。types —組み込み型の名前

  1. そして、クラスのNoneインスタンスですNoneType。したがって、None自分自身のインスタンスを作成したい場合があります。やってみよう

    print types.IntType()
    print types.NoneType()

    出力

    0
    TypeError: cannot create 'NoneType' instances

したがって、明らかに、NoneTypeインスタンスを作成できません。値の一意性について心配する必要はありませんNone

  1. None内部での実装方法を確認してみましょう。

    print dir(None)

    出力

    ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', 
     '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__',
     '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

を除いて__setattr__、他のすべては読み取り専用属性です。したがって、の属性を変更する方法はありませんNone

  1. 新しい属性を追加してみましょう 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インスタンスに動的に属性を作成することはできません。

  1. 何かを割り当てたときに何が起こるか確認してみましょうNone。ドキュメントに従って、それはをスローする必要がありSyntaxErrorます。つまり、に何かを割り当ててもNone、プログラムはまったく実行されません。

    None = 1

    出力

    SyntaxError: cannot assign to None

私たちはそれを確立しました

  1. None のインスタンスです NoneType
  2. None 新しい属性を持つことはできません
  3. の既存の属性はNone変更できません。
  4. 他のインスタンスを作成することはできません NoneType
  5. None値を割り当てることで参照を変更することもできません。

したがって、ドキュメントで述べたように、None実際にはと見なすことができますtrue constant

幸せを知るNone:)


とても面白い!! __setattr__Noneの用途が何か疑問がある
Grijesh Chauhan

9

あなたが参照しているは明らかにの意味を大幅に簡略化しようとしていNoneます。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

>>> def test(x=None):
...   if x is None:
...     print('no x here')
...   else:
...     print(x)
... 
>>> test()
no x here
>>> test('x!')
x!

この場合、この値が特別なNone値であることは、それほど重要ではありません。私は任意のデフォルト値を使用できました:

>>> def test(x=-1):
...   if x == -1:
...     print('no x here')
...   else:
...     print(x)
... 
>>> test()
no x here
>>> test('x!')
x!

…しかし、None周りにあることには2つの利点があります。

  1. -1意味がはっきりしないような特別な値を選ぶ必要はありません。
  2. 実際には、関数は-1通常の入力として処理する必要があります。
>>> test(-1)
no x here

おっとっと!

したがって、この本はほとんどリセットという単語の使用において少し誤解を招きやすい– None名前への割り当ては、その値が使用されていないか、関数がデフォルトの方法で動作する必要があるが値をリセットする必要があることをプログラマに知らせるシグナルである元の未定義の状態にするには、delキーワードを使用する必要があります。

>>> x = 3
>>> x
3
>>> del x
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

5

他の答えはすでに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が呼び出されるたびに同じリストが使用されることです。これは、デフォルトの引数の式が、呼び出されたときではなく、関数が定義されたときに計算されるためです。

LIST1LIST3は、従って、一方、同一のデフォルトリストに動作しているLIST2は、それが作成した別のリストで動作している(リスト・パラメータの値として、独自の空のリストを渡すことによって)。


救世主を「なし」:(上記の例を変更して目的の動作を生成します)

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へのクレジットの例


3

Noneはシングルトンオブジェクト(Noneが1つしかないことを意味します)であり、言語やライブラリのさまざまな場所で他の値がないことを表すために使用されます。


例えば:
場合はd辞書で、d.get(k)戻りますd[k]が存在する場合、しかしNone場合はd何の鍵を持っていませんk

すばらしいブログからこの情報を読んでください:http : //python-history.blogspot.in/


3

これらはすべて良い答えですが、理由を説明する必要があると思います None有用なの。

結婚式のRSVPを集めているとします。各人が出席するかどうかを記録したいとします。彼らが参加している場合は、を設定しperson.attending = Trueます。彼らが参加していない場合は、あなたが設定しperson.attending = Falseます。あなたはその後、任意のRSVPを受け取っていない場合person.attending = None。これにより、情報なしNoneと否定的な回答を区別できます。


1

私はコードの例(そして果物)が大好きなので、お見せしましょう

apple = "apple"
print(apple)
>>> apple
apple = None
print(apple)
>>> None

なしは何も意味せず、価値はありません。

どれもFalseと評価されません。


8
print(None)プリント... None。それはないではない、あなたがお勧めのように、何も印刷しません。
Martijn Pieters

REPL Noneは、最後の式の結果である場合にのみ何も表示しません。(ほとんどの場合、値を返すことを意図していない関数に役立ちます。)
Eevee

うーん、私の間違い、私はIDLEを使用していて、変数を出力することを想定していました。どうやらreplを使用しているようです。私は現在、自分のpython / javascript / codeの読み取りと理解のスキルを完璧にするためにSOを使用しているため、いくつかの間違いを犯しています:(
Azeirah

2
IDLEは、Pythonインタラクティブインタープリタープロンプトのように、それが式の結果であるかどうかを明示的に非表示にし None、ほとんど出力を乱雑にしないようにします。
Martijn Pieters

-5
largest=none
smallest =none 
While True :
          num =raw_input ('enter a number ') 
          if num =="done ": break 
          try :
           inp =int (inp) 
          except:
              Print'Invalid input' 
           if largest is none :
               largest=inp
           elif inp>largest:
                largest =none 
           print 'maximum', largest

          if smallest is none:
               smallest =none
          elif inp<smallest :
               smallest =inp
          print 'minimum', smallest 

print 'maximum, minimum, largest, smallest 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.