| この記事の要点 |
|
結論: if not で判定する
Python では、空の値は if 文の条件で「偽」として扱われます。そのため、変数が空かどうかは次のように書くのが最も簡潔で、Python の公式スタイルガイド(PEP 8)でも推奨されている書き方です。
if not val1:
# val1 が空の場合の処理
print('空です')
else:
print('値があります')
文字列でもリストでも辞書でも同じ書き方で判定できます。len(val1) == 0 や val1 == [] と書いても動きますが、型ごとに書き分ける必要があるため、通常は not を使います。
仕組み: 偽として扱われる値(falsy)
if の条件に置いた値は、真か偽かに自動で変換されて判定されます。偽として扱われる主な値は次のとおりで、これ以外のほとんどの値は真になります。
| 種類 | 偽になる値 | 真になる例 |
|---|---|---|
| None | None | ― |
| 真偽値 | False | True |
| 数値 | 0、0.0 | 1、-1、0.1 |
| 文字列 | ''(空文字) | ' '(空白 1 つ)、'0'、'False' |
| リスト・タプル | []、() | [None]、[0] |
| 辞書・集合 | {}、set() | {'a': None} |
文字列の '0' や 'False' は中身があるので真です。また、要素が None だけのリスト [None] も「要素が 1 つある」ので真になります。
目的別の判定方法
| 判定したいこと | 書き方 |
|---|---|
| 空っぽ全般(None・空文字・空リスト・0 など) | if not val: |
| None かどうかだけ | if val is None: |
| None でも空文字でもない文字列 | if val:(文字列型が確実な場合) |
| 空白だけの文字列も空とみなす | if not val or not val.strip(): |
| 空文字だけ | if val == '': |
| リストの要素数が 0 | if not lst: または if len(lst) == 0: |
| 辞書にキーがない | if 'key' not in d: |
落とし穴
0 や False も「空」と判定される
数値を扱う変数で not を使うと、正当な値の 0 まで「未入力」と判定されてしまいます。「値が設定されていない」を None で表しているなら、is None で判定します。
stock = 0 # 在庫 0 個という正しいデータ
if not stock:
print('在庫情報なし') # 0 でもここに入ってしまう
if stock is None:
print('在庫情報なし') # 0 のときは入らない
None の判定に == を使わない
val == None でもたいていは動きますが、クラスが == の動作を独自に定義していると結果が変わる可能性があります。None は常に 1 つしか存在しないオブジェクトなので、同一性を調べる is / is not で比較するのが正しい書き方です。
NumPy 配列や pandas では not が使えない
NumPy の配列に if not arr: と書くと、要素が 2 つ以上ある場合に ValueError: The truth value of an array with more than one element is ambiguous になります。要素数で判定します。
import numpy as np
import pandas as pd
arr = np.array([])
if arr.size == 0:
print('配列が空')
df = pd.DataFrame()
if df.empty:
print('DataFrame が空')
未定義の変数は判定できない
一度も代入していない変数を if not val: で調べると、空かどうか以前に NameError になります。条件によって代入されない可能性がある変数は、先頭で val = None のように初期化しておきます。辞書の値なら d.get('key') を使えば、キーがないときに None が返ります。
よくある使い方: 引数の省略を None で判定する
関数の引数が渡されなかったことを判定する場面では、既定値を None にして is None で調べるのが定番です。既定値に [] や {} を直接書くと、そのオブジェクトが呼び出しの間で共有されてしまい、前回の呼び出しで追加した要素が残るという有名な落とし穴があります。
# NG: 既定値のリストが呼び出しをまたいで共有される
def add_tag(tag, tags=[]):
tags.append(tag)
return tags
# OK: None で「省略された」を表し、関数の中で新しく作る
def add_tag(tag, tags=None):
if tags is None:
tags = []
tags.append(tag)
return tags
ここで if not tags: と書くと、呼び出し側が意図的に渡した空リストまで新しいリストに置き換わってしまいます。「省略された」と「空が渡された」を区別したいときは is None を使い分けます。
確認方法
ある値が真と偽のどちらに扱われるか迷ったら、bool() で確認できます。
>>> bool('')
False
>>> bool(' ')
True
>>> bool([0])
True
>>> bool(0.0)
False
関連
- Python の if 文|elif・三項演算子・match 文と条件式の書き方
- Python 論理演算子 and / or / not|短絡評価と bool を返さない挙動
- Python 辞書のキー存在チェック|in・get・KeyErrorの使い方
- Python でリストの要素数を取得|len() の使い方と多次元・条件付きカウント
- 【Python】can only concatenate str (not "NoneType") to str
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38