web-dev-qa-db-ja.com

None値とは何ですか?

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

Noneの値isが何で、何に使用するのか知りたいのですが。

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

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

どういう意味ですか?

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

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

最後の:

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

108
The_Diver

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と入力すると、Noneempty 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 = NoneFを元の状態にリセットしたら、そこにあるはずです。

>>> print(F)
None

F = Noneと入力し、ステッカーをNoneに貼り付けた後に行うように。


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

ブリッグスは、あなたが書きたいかもしれないすべてのステッカーがすでにNoneオブジェクトに貼り付けられているふりをしています。

85
DSM

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には undefinedANDnull などがあります。

Pythonでは、変数は使用されるために存在することに注意してください。最初に変数を宣言する必要はないので、Pythonには実際にはempty変数はありません。変数をNoneに設定することは、デフォルトの空の値に設定することとは異なります。 Noneも値です。ただし、signalemptynessによく使用されます。あなたが読んでいる本は、その点で誤解を招きます。

55
Martijn Pieters

これは、 PythonドキュメントNoneについて述べたことです:

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

バージョン2.4で変更:Noneへの割り当ては違法で、SyntaxErrorが発生します。

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

  1. 最初にNoneの型を確認しましょう

    print type(None)
    print None.__class__
    

    出力

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

基本的に、NoneTypeintfloatなどと同様のデータ型です。Pythonで使用可能なデフォルトの型のリストは、8.15。 types —組み込み型の名前

  1. また、NoneNoneTypeクラスのインスタンスです。したがって、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. NoneNoneTypeのインスタンスです
  2. Noneは新しい属性を持つことができません
  3. Noneの既存の属性は変更できません。
  4. NoneTypeの他のインスタンスを作成することはできません
  5. 値を割り当ててNoneへの参照を変更することさえできません。

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

Noneを知って幸せ:)

19
thefourtheye

あなたが参照するのは、明らかにNonename__の意味を単純化するしようとしていることです。 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

ただし、変数が定義されているかどうかによって関数の意味を変えたい場合があります。 Nonename__のデフォルト値を使用して引数を作成できます。

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

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

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

…ただし、Nonename__を使用すると、2つの利点が得られます。

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

おっとっと!

そのため、この本は主にWordresetの使用において少し誤解を招きます。Nonename__を名前に割り当てることは、その値がそうでないというプログラマーへの合図です。 tが使用されているか、関数がデフォルトの方法で動作する必要がありますが、値を元の未定義の状態にresetするには、delname__キーワードを使用する必要があります。

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

他の答えはすでに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へのクレジットの例

4
Jadav Bheda

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


例:
dが辞書の場合、d.get(k)d[k]を返しますが、Noneにキーdがない場合はkを返します。

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

3
GrvTyagi

コード例(およびフルーツ)が大好きなので、見せましょう

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

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

Falseと評価されるものはありません。

1
Azeirah