PythonにおけるNoneとは?いつつかうのか?

Pythonista Tips 2/N

公開日: 2021-08-31
更新日: 2023-10-08

  Table of Contents

PythonにおけるNoneとは?

Def: None in Python

  • Noneとは, 関数が返すvalueが存在しないときや, 関数のデフォルトパラメーターとして何も渡さないときなど, 表現するvalueが存在しないときに使用するvalueのこと
  • NoneType objectの唯一のvalue
1
2
type(None)
>> <type 'NoneType'>

Noneは「空の値」と「存在しない値」を区別するためにPythonでは使用されます.

1
2
3
4
EmptyString = ''
EmptyList = []
EmptySet = set()
EmptyDict = dict({})

上記はそれぞれ「空の値」ですが, Noneではありません. また, False0とも異なります.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def is_none(obj):
    if obj is None:
        print(obj, ": It's None")
    elif obj:
        print(obj, ": It's True")
    elif obj is False:
        print(obj, ": It's False")
    else:
        print(obj, ": others")

check_list = [True, False, None, 0, 0.0, 1, -1, '', 'a']
for i in check_list:
    is_none(i)

>> True : It's True
>> False : It's False
>> None : It's None
>> 0 : others
>> 0.0 : others
>> 1 : It's True
>> -1 : It's True
>>  : others
>> a : It's True

Noneの判定

Rule: Noneの判定

  • None のようなシングルトンと比較をする場合は, 常に isis not を使うべき
  • 絶対に等値演算子を使わない

from コーディング規約PEP8

1
2
3
4
5
6
a = None
print(a is None)
>> True

print(a is not None)
>> False

なぜ is Noneを使うべきなのか?

is と == の違い

is==は,

  • 前者が同一性(=Identity)の比較
  • 後者が同値性(=Equality)の比較

となってるという違いがあります. オブジェクトの同一性は id() 関数を使って判定しています. 例として, x is y は、 xy が同じオブジェクトを指すとき, かつそのときに限り真になります.

これは例を見たほうが早いので,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class NoneTest():
    def __init__(self):
        pass

    def __eq__(self, other):
        return True

class BrokenNoneTest():
    def __eq__(self, other):
        return True

NoneTester_1 = NoneTest()
NoneTester_2 = BrokenNoneTest()

## type check
print(type(NoneTester_1))
>> <class '__main__.NoneTest'>

print(type(NoneTester_2))
>> <class '__main__.BrokenNoneTest'>

print(type(None))
>> <class 'NoneType'>

## 違うobject idを返すことの確認
print(id(NoneTester_1), id(NoneTester_2), id(None))
>> 139844009293264 139844009290512 139844232076320

## 判定
print(NonTester_1 == None)
>> True

print(NonTester_2 == None)
>> True

print(NonTester_1 is None)
>> False

print(NonTester_2 is None)
>> False


Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)