-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathcomparisons.html
More file actions
199 lines (172 loc) · 47.9 KB
/
comparisons.html
File metadata and controls
199 lines (172 loc) · 47.9 KB
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Python - Comparisons</title>
<meta name="generator" content="VuePress 1.8.2">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="description" content="Chain Comparisons, Comparison by `is` vs `==`, Greater than or less than, Not equal to, Equal To, Comparing Objects, Common Gotcha: Python does not enforce typing">
<meta property="og:site_name" content="DevTut">
<meta property="og:title" content="Python - Comparisons">
<meta property="og:description" content="Chain Comparisons, Comparison by `is` vs `==`, Greater than or less than, Not equal to, Equal To, Comparing Objects, Common Gotcha: Python does not enforce typing">
<meta property="og:type" content="article">
<meta property="og:url" content="/python/comparisons.html">
<meta property="og:image" content="/logo.png">
<meta name="twitter:title" content="Python - Comparisons">
<meta name="twitter:description" content="Chain Comparisons, Comparison by `is` vs `==`, Greater than or less than, Not equal to, Equal To, Comparing Objects, Common Gotcha: Python does not enforce typing">
<meta name="twitter:url" content="/python/comparisons.html">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="/logo.png">
<meta name="theme-color" content="#ffffff">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="msapplication-TileImage" content="/mstile-150x150.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="google-site-verification" content="76_rKXgwMVIjd-axJC_1zPV9OS4mEjvtgjYOWVkAdnQ">
<link rel="preload" href="/assets/css/0.styles.60619e34.css" as="style"><link rel="preload" href="/assets/js/app.1779e102.js" as="script"><link rel="preload" href="/assets/js/3.2cfa8016.js" as="script"><link rel="preload" href="/assets/js/2671.1b81052c.js" as="script">
<link rel="stylesheet" href="/assets/css/0.styles.60619e34.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">DevTut</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"> <a href="https://github.com/devtut/generate" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Python</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/python/" aria-current="page" class="sidebar-link">Disclaimer</a></li><li><a href="/python/getting-started-with-python-language.html" class="sidebar-link">Getting started with Python Language</a></li><li><a href="/python/python-data-types.html" class="sidebar-link">Python Data Types</a></li><li><a href="/python/indentation.html" class="sidebar-link">Indentation</a></li><li><a href="/python/comments-and-documentation.html" class="sidebar-link">Comments and Documentation</a></li><li><a href="/python/date-and-time.html" class="sidebar-link">Date and Time</a></li><li><a href="/python/enum.html" class="sidebar-link">Enum</a></li><li><a href="/python/set.html" class="sidebar-link">Set</a></li><li><a href="/python/simple-mathematical-operators.html" class="sidebar-link">Simple Mathematical Operators</a></li><li><a href="/python/bitwise-operators.html" class="sidebar-link">Bitwise Operators</a></li><li><a href="/python/boolean-operators.html" class="sidebar-link">Boolean Operators</a></li><li><a href="/python/operator-precedence.html" class="sidebar-link">Operator Precedence</a></li><li><a href="/python/variable-scope-and-binding.html" class="sidebar-link">Variable Scope and Binding</a></li><li><a href="/python/conditionals.html" class="sidebar-link">Conditionals</a></li><li><a href="/python/comparisons.html" aria-current="page" class="active sidebar-link">Comparisons</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/python/comparisons.html#chain-comparisons" class="sidebar-link">Chain Comparisons</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#comparison-by-is-vs" class="sidebar-link">Comparison by is vs ==</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#greater-than-or-less-than" class="sidebar-link">Greater than or less than</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#not-equal-to" class="sidebar-link">Not equal to</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#equal-to" class="sidebar-link">Equal To</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#comparing-objects" class="sidebar-link">Comparing Objects</a></li><li class="sidebar-sub-header"><a href="/python/comparisons.html#common-gotcha-python-does-not-enforce-typing" class="sidebar-link">Common Gotcha: Python does not enforce typing</a></li></ul></li><li><a href="/python/loops.html" class="sidebar-link">Loops</a></li><li><a href="/python/arrays.html" class="sidebar-link">Arrays</a></li><li><a href="/python/multidimensional-arrays.html" class="sidebar-link">Multidimensional arrays</a></li><li><a href="/python/dictionary.html" class="sidebar-link">Dictionary</a></li><li><a href="/python/list.html" class="sidebar-link">List</a></li><li><a href="/python/list-comprehensions.html" class="sidebar-link">List Comprehensions</a></li><li><a href="/python/list-slicing-selecting-parts-of-lists.html" class="sidebar-link">List slicing (selecting parts of lists)</a></li><li><a href="/python/groupby.html" class="sidebar-link">groupby()</a></li><li><a href="/python/linked-lists.html" class="sidebar-link">Linked lists</a></li><li><a href="/python/linked-list-node.html" class="sidebar-link">Linked List Node</a></li><li><a href="/python/filter.html" class="sidebar-link">Filter</a></li><li><a href="/python/heapq.html" class="sidebar-link">Heapq</a></li><li><a href="/python/tuple.html" class="sidebar-link">Tuple</a></li><li><a href="/python/basic-input-and-output.html" class="sidebar-link">Basic Input and Output</a></li><li><a href="/python/files-folders-i-o.html" class="sidebar-link">Files & Folders I/O</a></li><li><a href="/python/os-path.html" class="sidebar-link">os.path</a></li><li><a href="/python/iterables-and-iterators.html" class="sidebar-link">Iterables and Iterators</a></li><li><a href="/python/functions.html" class="sidebar-link">Functions</a></li><li><a href="/python/defining-functions-with-list-arguments.html" class="sidebar-link">Defining functions with list arguments</a></li><li><a href="/python/functional-programming-in-python.html" class="sidebar-link">Functional Programming in Python</a></li><li><a href="/python/partial-functions.html" class="sidebar-link">Partial functions</a></li><li><a href="/python/decorators.html" class="sidebar-link">Decorators</a></li><li><a href="/python/classes.html" class="sidebar-link">Classes</a></li><li><a href="/python/metaclasses.html" class="sidebar-link">Metaclasses</a></li><li><a href="/python/string-formatting.html" class="sidebar-link">String Formatting</a></li><li><a href="/python/string-methods.html" class="sidebar-link">String Methods</a></li><li><a href="/python/using-loops-within-functions.html" class="sidebar-link">Using loops within functions</a></li><li><a href="/python/importing-modules.html" class="sidebar-link">Importing modules</a></li><li><a href="/python/difference-between-module-and-package.html" class="sidebar-link">Difference between Module and Package</a></li><li><a href="/python/math-module.html" class="sidebar-link">Math Module</a></li><li><a href="/python/complex-math.html" class="sidebar-link">Complex math</a></li><li><a href="/python/collections-module.html" class="sidebar-link">Collections module</a></li><li><a href="/python/operator-module.html" class="sidebar-link">Operator module</a></li><li><a href="/python/json-module.html" class="sidebar-link">JSON Module</a></li><li><a href="/python/sqlite3-module.html" class="sidebar-link">Sqlite3 Module</a></li><li><a href="/python/the-os-module.html" class="sidebar-link">The os Module</a></li><li><a href="/python/the-locale-module.html" class="sidebar-link">The locale Module</a></li><li><a href="/python/itertools-module.html" class="sidebar-link">Itertools Module</a></li><li><a href="/python/asyncio-module.html" class="sidebar-link">Asyncio Module</a></li><li><a href="/python/random-module.html" class="sidebar-link">Random module</a></li><li><a href="/python/functools-module.html" class="sidebar-link">Functools Module</a></li><li><a href="/python/the-dis-module.html" class="sidebar-link">The dis module</a></li><li><a href="/python/the-base64-module.html" class="sidebar-link">The base64 Module</a></li><li><a href="/python/queue-module.html" class="sidebar-link">Queue Module</a></li><li><a href="/python/deque-module.html" class="sidebar-link">Deque Module</a></li><li><a href="/python/webbrowser-module.html" class="sidebar-link">Webbrowser Module</a></li><li><a href="/python/tkinter.html" class="sidebar-link">tkinter</a></li><li><a href="/python/pyautogui-module.html" class="sidebar-link">pyautogui module</a></li><li><a href="/python/indexing-and-slicing.html" class="sidebar-link">Indexing and Slicing</a></li><li><a href="/python/plotting-with-matplotlib.html" class="sidebar-link">Plotting with Matplotlib</a></li><li><a href="/python/graph-tool.html" class="sidebar-link">graph-tool</a></li><li><a href="/python/generators.html" class="sidebar-link">Generators</a></li><li><a href="/python/reduce.html" class="sidebar-link">Reduce</a></li><li><a href="/python/map-function.html" class="sidebar-link">Map Function</a></li><li><a href="/python/exponentiation.html" class="sidebar-link">Exponentiation</a></li><li><a href="/python/searching.html" class="sidebar-link">Searching</a></li><li><a href="/python/sorting-minimum-and-maximum.html" class="sidebar-link">Sorting, Minimum and Maximum</a></li><li><a href="/python/counting.html" class="sidebar-link">Counting</a></li><li><a href="/python/the-print-function.html" class="sidebar-link">The Print Function</a></li><li><a href="/python/regular-expressions-regex.html" class="sidebar-link">Regular Expressions (Regex)</a></li><li><a href="/python/copying-data.html" class="sidebar-link">Copying data</a></li><li><a href="/python/context-managers-with-statement.html" class="sidebar-link">Context Managers (“with” Statement)</a></li><li><a href="/python/the-name-special-variable.html" class="sidebar-link">The _name_ special variable</a></li><li><a href="/python/checking-path-existence-and-permissions.html" class="sidebar-link">Checking Path Existence and Permissions</a></li><li><a href="/python/creating-python-packages.html" class="sidebar-link">Creating Python packages</a></li><li><a href="/python/usage-of-pip-module-pypi-package-manager.html" class="sidebar-link">Usage of "pip" module: PyPI Package Manager</a></li><li><a href="/python/pip-pypi-package-manager.html" class="sidebar-link">pip: PyPI Package Manager</a></li><li><a href="/python/parsing-command-line-arguments.html" class="sidebar-link">Parsing Command Line arguments</a></li><li><a href="/python/subprocess-library.html" class="sidebar-link">Subprocess Library</a></li><li><a href="/python/setup-py.html" class="sidebar-link">setup.py</a></li><li><a href="/python/recursion.html" class="sidebar-link">Recursion</a></li><li><a href="/python/type-hints.html" class="sidebar-link">Type Hints</a></li><li><a href="/python/exceptions.html" class="sidebar-link">Exceptions</a></li><li><a href="/python/raise-custom-errors-exceptions.html" class="sidebar-link">Raise Custom Errors / Exceptions</a></li><li><a href="/python/commonwealth-exceptions.html" class="sidebar-link">Commonwealth Exceptions</a></li><li><a href="/python/urllib.html" class="sidebar-link">urllib</a></li><li><a href="/python/web-scraping-with-python.html" class="sidebar-link">Web scraping with Python</a></li><li><a href="/python/html-parsing.html" class="sidebar-link">HTML Parsing</a></li><li><a href="/python/manipulating-xml.html" class="sidebar-link">Manipulating XML</a></li><li><a href="/python/python-requests-post.html" class="sidebar-link">Python Requests Post</a></li><li><a href="/python/distribution.html" class="sidebar-link">Distribution</a></li><li><a href="/python/property-objects.html" class="sidebar-link">Property Objects</a></li><li><a href="/python/overloading.html" class="sidebar-link">Overloading</a></li><li><a href="/python/polymorphism.html" class="sidebar-link">Polymorphism</a></li><li><a href="/python/method-overriding.html" class="sidebar-link">Method Overriding</a></li><li><a href="/python/user-defined-methods.html" class="sidebar-link">User-Defined Methods</a></li><li><a href="/python/string-representations-of-class-instances-str-and-repr-methods.html" class="sidebar-link">String representations of class instances: _str and repr_ methods</a></li><li><a href="/python/debugging.html" class="sidebar-link">Debugging</a></li><li><a href="/python/reading-and-writing-csv.html" class="sidebar-link">Reading and Writing CSV</a></li><li><a href="/python/writing-to-csv-from-string-or-list.html" class="sidebar-link">Writing to CSV from String or List</a></li><li><a href="/python/dynamic-code-execution-with-exec-and-eval.html" class="sidebar-link">Dynamic code execution with exec and eval</a></li><li><a href="/python/pyinstaller-distributing-python-code.html" class="sidebar-link">PyInstaller - Distributing Python Code</a></li><li><a href="/python/data-visualization-with-python.html" class="sidebar-link">Data Visualization with Python</a></li><li><a href="/python/the-interpreter-command-line-console.html" class="sidebar-link">The Interpreter (Command Line Console)</a></li><li><a href="/python/args-and-kwargs.html" class="sidebar-link">args and *kwargs</a></li><li><a href="/python/garbage-collection.html" class="sidebar-link">Garbage Collection</a></li><li><a href="/python/pickle-data-serialisation.html" class="sidebar-link">Pickle data serialisation</a></li><li><a href="/python/binary-data.html" class="sidebar-link">Binary Data</a></li><li><a href="/python/idioms.html" class="sidebar-link">Idioms</a></li><li><a href="/python/data-serialization.html" class="sidebar-link">Data Serialization</a></li><li><a href="/python/multiprocessing.html" class="sidebar-link">Multiprocessing</a></li><li><a href="/python/multithreading.html" class="sidebar-link">Multithreading</a></li><li><a href="/python/processes-and-threads.html" class="sidebar-link">Processes and Threads</a></li><li><a href="/python/python-concurrency.html" class="sidebar-link">Python concurrency</a></li><li><a href="/python/parallel-computation.html" class="sidebar-link">Parallel computation</a></li><li><a href="/python/sockets.html" class="sidebar-link">Sockets</a></li><li><a href="/python/websockets.html" class="sidebar-link">Websockets</a></li><li><a href="/python/sockets-and-message-encryption-decryption-between-client-and-server.html" class="sidebar-link">Sockets And Message Encryption/Decryption Between Client and Server</a></li><li><a href="/python/python-networking.html" class="sidebar-link">Python Networking</a></li><li><a href="/python/python-http-server.html" class="sidebar-link">Python HTTP Server</a></li><li><a href="/python/flask.html" class="sidebar-link">Flask</a></li><li><a href="/python/introduction-to-rabbitmq-using-amqpstorm.html" class="sidebar-link">Introduction to RabbitMQ using AMQPStorm</a></li><li><a href="/python/descriptor.html" class="sidebar-link">Descriptor</a></li><li><a href="/python/tempfile-namedtemporaryfile.html" class="sidebar-link">tempfile NamedTemporaryFile</a></li><li><a href="/python/input-subset-and-output-external-data-files-using-pandas.html" class="sidebar-link">Input, Subset and Output External Data Files using Pandas</a></li><li><a href="/python/unzipping-files.html" class="sidebar-link">Unzipping Files</a></li><li><a href="/python/working-with-zip-archives.html" class="sidebar-link">Working with ZIP archives</a></li><li><a href="/python/getting-start-with-gzip.html" class="sidebar-link">getting start with GZip</a></li><li><a href="/python/stack.html" class="sidebar-link">Stack</a></li><li><a href="/python/working-around-the-global-interpreter-lock-gil.html" class="sidebar-link">Working around the Global Interpreter Lock (GIL)</a></li><li><a href="/python/deployment.html" class="sidebar-link">Deployment</a></li><li><a href="/python/logging.html" class="sidebar-link">Logging</a></li><li><a href="/python/web-server-gateway-interface-wsgi.html" class="sidebar-link">Web Server Gateway Interface (WSGI)</a></li><li><a href="/python/python-server-sent-events.html" class="sidebar-link">Python Server Sent Events</a></li><li><a href="/python/alternatives-to-switch-statement-from-other-languages.html" class="sidebar-link">Alternatives to switch statement from other languages</a></li><li><a href="/python/list-destructuring-aka-packing-and-unpacking.html" class="sidebar-link">List destructuring (aka packing and unpacking)</a></li><li><a href="/python/accessing-python-source-code-and-bytecode.html" class="sidebar-link">Accessing Python source code and bytecode</a></li><li><a href="/python/mixins.html" class="sidebar-link">Mixins</a></li><li><a href="/python/attribute-access.html" class="sidebar-link">Attribute Access</a></li><li><a href="/python/arcpy.html" class="sidebar-link">ArcPy</a></li><li><a href="/python/abstract-base-classes-abc.html" class="sidebar-link">Abstract Base Classes (abc)</a></li><li><a href="/python/plugin-and-extension-classes.html" class="sidebar-link">Plugin and Extension Classes</a></li><li><a href="/python/immutable-datatypes-int-float-str-tuple-and-frozensets.html" class="sidebar-link">Immutable datatypes(int, float, str, tuple and frozensets)</a></li><li><a href="/python/incompatibilities-moving-from-python-2-to-python-3.html" class="sidebar-link">Incompatibilities moving from Python 2 to Python 3</a></li><li><a href="/python/2to3-tool.html" class="sidebar-link">2to3 tool</a></li><li><a href="/python/non-official-python-implementations.html" class="sidebar-link">Non-official Python implementations</a></li><li><a href="/python/abstract-syntax-tree.html" class="sidebar-link">Abstract syntax tree</a></li><li><a href="/python/unicode-and-bytes.html" class="sidebar-link">Unicode and bytes</a></li><li><a href="/python/python-serial-communication-pyserial.html" class="sidebar-link">Python Serial Communication (pyserial)</a></li><li><a href="/python/neo4j-and-cypher-using-py2neo.html" class="sidebar-link">Neo4j and Cypher using Py2Neo</a></li><li><a href="/python/basic-curses-with-python.html" class="sidebar-link">Basic Curses with Python</a></li><li><a href="/python/templates-in-python.html" class="sidebar-link">Templates in python</a></li><li><a href="/python/pillow.html" class="sidebar-link">Pillow</a></li><li><a href="/python/the-pass-statement.html" class="sidebar-link">The pass statement</a></li><li><a href="/python/cli-subcommands-with-precise-help-output.html" class="sidebar-link">CLI subcommands with precise help output</a></li><li><a href="/python/database-access.html" class="sidebar-link">Database Access</a></li><li><a href="/python/connecting-python-to-sql-server.html" class="sidebar-link">Connecting Python to SQL Server</a></li><li><a href="/python/postgresql.html" class="sidebar-link">PostgreSQL</a></li><li><a href="/python/python-and-excel.html" class="sidebar-link">Python and Excel</a></li><li><a href="/python/turtle-graphics.html" class="sidebar-link">Turtle Graphics</a></li><li><a href="/python/python-persistence.html" class="sidebar-link">Python Persistence</a></li><li><a href="/python/design-patterns.html" class="sidebar-link">Design Patterns</a></li><li><a href="/python/hashlib.html" class="sidebar-link">hashlib</a></li><li><a href="/python/creating-a-windows-service-using-python.html" class="sidebar-link">Creating a Windows service using Python</a></li><li><a href="/python/mutable-vs-immutable-and-hashable-in-python.html" class="sidebar-link">Mutable vs Immutable (and Hashable) in Python</a></li><li><a href="/python/configparser.html" class="sidebar-link">configparser</a></li><li><a href="/python/optical-character-recognition.html" class="sidebar-link">Optical Character Recognition</a></li><li><a href="/python/virtual-environments.html" class="sidebar-link">Virtual environments</a></li><li><a href="/python/python-virtual-environment-virtualenv.html" class="sidebar-link">Python Virtual Environment - virtualenv</a></li><li><a href="/python/virtual-environment-with-virtualenvwrapper.html" class="sidebar-link">virtual environment with virtualenvwrapper</a></li><li><a href="/python/create-virtual-environment-with-virtualenvwrapper-in-windows.html" class="sidebar-link">Create virtual environment with virtualenvwrapper in windows</a></li><li><a href="/python/sys.html" class="sidebar-link">sys</a></li><li><a href="/python/chempy-python-package.html" class="sidebar-link">ChemPy - python package</a></li><li><a href="/python/pygame.html" class="sidebar-link">pygame</a></li><li><a href="/python/pyglet.html" class="sidebar-link">Pyglet</a></li><li><a href="/python/audio.html" class="sidebar-link">Audio</a></li><li><a href="/python/pyaudio.html" class="sidebar-link">pyaudio</a></li><li><a href="/python/shelve.html" class="sidebar-link">shelve</a></li><li><a href="/python/iot-programming-with-python-and-raspberry-pi.html" class="sidebar-link">IoT Programming with Python and Raspberry PI</a></li><li><a href="/python/kivy-cross-platform-python-framework-for-nui-development.html" class="sidebar-link">kivy - Cross-platform Python Framework for NUI Development</a></li><li><a href="/python/pandas-transform-preform-operations-on-groups-and-concatenate-the-results.html" class="sidebar-link">Pandas Transform: Preform operations on groups and concatenate the results</a></li><li><a href="/python/similarities-in-syntax-differences-in-meaning-python-vs-javascript.html" class="sidebar-link">Similarities in syntax, Differences in meaning: Python vs. JavaScript</a></li><li><a href="/python/call-python-from-c.html" class="sidebar-link">Call Python from C#</a></li><li><a href="/python/ctypes.html" class="sidebar-link">ctypes</a></li><li><a href="/python/writing-extensions.html" class="sidebar-link">Writing extensions</a></li><li><a href="/python/python-lex-yacc.html" class="sidebar-link">Python Lex-Yacc</a></li><li><a href="/python/unit-testing.html" class="sidebar-link">Unit Testing</a></li><li><a href="/python/py-test.html" class="sidebar-link">py.test</a></li><li><a href="/python/profiling.html" class="sidebar-link">Profiling</a></li><li><a href="/python/python-speed-of-program.html" class="sidebar-link">Python speed of program</a></li><li><a href="/python/performance-optimization.html" class="sidebar-link">Performance optimization</a></li><li><a href="/python/security-and-cryptography.html" class="sidebar-link">Security and Cryptography</a></li><li><a href="/python/secure-shell-connection-in-python.html" class="sidebar-link">Secure Shell Connection in Python</a></li><li><a href="/python/python-anti-patterns.html" class="sidebar-link">Python Anti-Patterns</a></li><li><a href="/python/common-pitfalls.html" class="sidebar-link">Common Pitfalls</a></li><li><a href="/python/hidden-features.html" class="sidebar-link">Hidden Features</a></li><li><a href="/python/date-formatting.html" class="sidebar-link">Date Formatting</a></li><li><a href="/python/ijson.html" class="sidebar-link">ijson</a></li><li><a href="/python/django.html" class="sidebar-link">Django</a></li><li><a href="/python/code-blocks-execution-frames-and-namespaces.html" class="sidebar-link">Code blocks, execution frames, and namespaces</a></li><li><a href="/python/contributors.html" class="sidebar-link">The Contributors</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="comparisons"><a href="#comparisons" class="header-anchor">#</a> Comparisons</h1> <h2 id="chain-comparisons"><a href="#chain-comparisons" class="header-anchor">#</a> Chain Comparisons</h2> <p>You can compare multiple items with multiple comparison operators with chain comparison. For example</p> <div class="language-py extra-class"><pre class="language-py"><code>x <span class="token operator">></span> y <span class="token operator">></span> z
</code></pre></div><p>is just a short form of:</p> <div class="language-py extra-class"><pre class="language-py"><code>x <span class="token operator">></span> y <span class="token keyword">and</span> y <span class="token operator">></span> z
</code></pre></div><p>This will evaluate to <code>True</code> only if both comparisons are <code>True</code>.</p> <p>The general form is</p> <div class="language-py extra-class"><pre class="language-py"><code>a OP b OP c OP d <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
</code></pre></div><p>Where <code>OP</code> represents one of the multiple comparison operations you can use, and the letters represent arbitrary valid expressions.</p> <blockquote></blockquote> <p>Note that <code>0 != 1 != 0</code> evaluates to <code>True</code>, even though <code>0 != 0</code> is <code>False</code>. Unlike the common mathematical notation in which <code>x != y != z</code> means that <code>x</code>, <code>y</code> and <code>z</code> have different values. Chaining <code>==</code> operations has the natural meaning in most cases, since equality is generally transitive.</p> <h3 id="style"><a href="#style" class="header-anchor">#</a> Style</h3> <p>There is no theoretical limit on how many items and comparison operations you use as long you have proper syntax:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">1</span> <span class="token operator">></span> <span class="token operator">-</span><span class="token number">1</span> <span class="token operator"><</span> <span class="token number">2</span> <span class="token operator">></span> <span class="token number">0.5</span> <span class="token operator"><</span> <span class="token number">100</span> <span class="token operator">!=</span> <span class="token number">24</span>
</code></pre></div><p>The above returns <code>True</code> if each comparison returns <code>True</code>. However, using convoluted chaining is not a good style. A good chaining will be "directional", not more complicated than</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">1</span> <span class="token operator">></span> x <span class="token operator">></span> <span class="token operator">-</span><span class="token number">4</span> <span class="token operator">></span> y <span class="token operator">!=</span> <span class="token number">8</span>
</code></pre></div><h3 id="side-effects"><a href="#side-effects" class="header-anchor">#</a> Side effects</h3> <p>As soon as one comparison returns <code>False</code>, the expression evaluates immediately to <code>False</code>, skipping all remaining comparisons.</p> <p>Note that the expression <code>exp</code> in <code>a > exp > b</code> will be evaluated only once, whereas in the case of</p> <div class="language-py extra-class"><pre class="language-py"><code>a <span class="token operator">></span> exp <span class="token keyword">and</span> exp <span class="token operator">></span> b
</code></pre></div><p><code>exp</code> will be computed twice if <code>a > exp</code> is true.</p> <h2 id="comparison-by-is-vs"><a href="#comparison-by-is-vs" class="header-anchor">#</a> Comparison by <code>is</code> vs <code>==</code></h2> <p>A common pitfall is confusing the equality comparison operators <code>is</code> and <code>==</code>.</p> <p><code>a == b</code> compares the value of <code>a</code> and <code>b</code>.</p> <p><code>a is b</code> will compare the <strong>identities</strong> of <code>a</code> and <code>b</code>.</p> <p>To illustrate:</p> <div class="language-py extra-class"><pre class="language-py"><code>a <span class="token operator">=</span> <span class="token string">'Python is fun!'</span>
b <span class="token operator">=</span> <span class="token string">'Python is fun!'</span>
a <span class="token operator">==</span> b <span class="token comment"># returns True</span>
a <span class="token keyword">is</span> b <span class="token comment"># returns False</span>
a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span>
b <span class="token operator">=</span> a <span class="token comment"># b references a</span>
a <span class="token operator">==</span> b <span class="token comment"># True</span>
a <span class="token keyword">is</span> b <span class="token comment"># True</span>
b <span class="token operator">=</span> a<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">]</span> <span class="token comment"># b now references a copy of a</span>
a <span class="token operator">==</span> b <span class="token comment"># True</span>
a <span class="token keyword">is</span> b <span class="token comment"># False [!!]</span>
</code></pre></div><p>Basically, <code>is</code> can be thought of as shorthand for <code>id(a) == id(b)</code>.</p> <p>Beyond this, there are quirks of the run-time environment that further complicate things. Short strings and small integers will return <code>True</code> when compared with <code>is</code>, due to the Python machine attempting to use less memory for identical objects.</p> <div class="language-py extra-class"><pre class="language-py"><code>a <span class="token operator">=</span> <span class="token string">'short'</span>
b <span class="token operator">=</span> <span class="token string">'short'</span>
c <span class="token operator">=</span> <span class="token number">5</span>
d <span class="token operator">=</span> <span class="token number">5</span>
a <span class="token keyword">is</span> b <span class="token comment"># True</span>
c <span class="token keyword">is</span> d <span class="token comment"># True</span>
</code></pre></div><p>But longer strings and larger integers will be stored separately.</p> <div class="language-py extra-class"><pre class="language-py"><code>a <span class="token operator">=</span> <span class="token string">'not so short'</span>
b <span class="token operator">=</span> <span class="token string">'not so short'</span>
c <span class="token operator">=</span> <span class="token number">1000</span>
d <span class="token operator">=</span> <span class="token number">1000</span>
a <span class="token keyword">is</span> b <span class="token comment"># False</span>
c <span class="token keyword">is</span> d <span class="token comment"># False</span>
</code></pre></div><p>You should use <code>is</code> to test for <code>None</code>:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">if</span> myvar <span class="token keyword">is</span> <span class="token keyword">not</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token comment"># not None</span>
<span class="token keyword">pass</span>
<span class="token keyword">if</span> myvar <span class="token keyword">is</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
<span class="token comment"># None</span>
<span class="token keyword">pass</span>
</code></pre></div><p>A use of <code>is</code> is to test for a “sentinel” (i.e. a unique object).</p> <div class="language-py extra-class"><pre class="language-py"><code>sentinel <span class="token operator">=</span> <span class="token builtin">object</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">myfunc</span><span class="token punctuation">(</span>var<span class="token operator">=</span>sentinel<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">if</span> var <span class="token keyword">is</span> sentinel<span class="token punctuation">:</span>
<span class="token comment"># value wasn’t provided</span>
<span class="token keyword">pass</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
<span class="token comment"># value was provided</span>
<span class="token keyword">pass</span>
</code></pre></div><h2 id="greater-than-or-less-than"><a href="#greater-than-or-less-than" class="header-anchor">#</a> Greater than or less than</h2> <div class="language-py extra-class"><pre class="language-py"><code>x <span class="token operator">></span> y
x <span class="token operator"><</span> y
</code></pre></div><p>These operators compare two types of values, they're the less than and greater than operators. For numbers this simply compares the numerical values to see which is larger:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">12</span> <span class="token operator">></span> <span class="token number">4</span>
<span class="token comment"># True</span>
<span class="token number">12</span> <span class="token operator"><</span> <span class="token number">4</span>
<span class="token comment"># False</span>
<span class="token number">1</span> <span class="token operator"><</span> <span class="token number">4</span>
<span class="token comment"># True</span>
</code></pre></div><p>For strings they will compare lexicographically, which is similar to alphabetical order but not quite the same.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token string">"alpha"</span> <span class="token operator"><</span> <span class="token string">"beta"</span>
<span class="token comment"># True</span>
<span class="token string">"gamma"</span> <span class="token operator">></span> <span class="token string">"beta"</span>
<span class="token comment"># True</span>
<span class="token string">"gamma"</span> <span class="token operator"><</span> <span class="token string">"OMEGA"</span>
<span class="token comment"># False</span>
</code></pre></div><p>In these comparisons, lowercase letters are considered 'greater than' uppercase, which is why <code>"gamma" < "OMEGA"</code> is false. If they were all uppercase it would return the expected alphabetical ordering result:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token string">"GAMMA"</span> <span class="token operator"><</span> <span class="token string">"OMEGA"</span>
<span class="token comment"># True</span>
</code></pre></div><p>Each type defines it's calculation with the <code><</code> and <code>></code> operators differently, so you should investigate what the operators mean with a given type before using it.</p> <h2 id="not-equal-to"><a href="#not-equal-to" class="header-anchor">#</a> Not equal to</h2> <div class="language-py extra-class"><pre class="language-py"><code>x <span class="token operator">!=</span> y
</code></pre></div><p>This returns <code>True</code> if <code>x</code> and <code>y</code> are not equal and otherwise returns <code>False</code>.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">12</span> <span class="token operator">!=</span> <span class="token number">1</span>
<span class="token comment"># True</span>
<span class="token number">12</span> <span class="token operator">!=</span> <span class="token string">'12'</span>
<span class="token comment"># True</span>
<span class="token string">'12'</span> <span class="token operator">!=</span> <span class="token string">'12'</span>
<span class="token comment"># False</span>
</code></pre></div><h2 id="equal-to"><a href="#equal-to" class="header-anchor">#</a> Equal To</h2> <div class="language-py extra-class"><pre class="language-py"><code>x <span class="token operator">==</span> y
</code></pre></div><p>This expression evaluates if <code>x</code> and <code>y</code> are the same value and returns the result as a boolean value. Generally both type and value need to match, so the int <code>12</code> is not the same as the string <code>'12'</code>.</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token number">12</span> <span class="token operator">==</span> <span class="token number">12</span>
<span class="token comment"># True</span>
<span class="token number">12</span> <span class="token operator">==</span> <span class="token number">1</span>
<span class="token comment"># False</span>
<span class="token string">'12'</span> <span class="token operator">==</span> <span class="token string">'12'</span>
<span class="token comment"># True</span>
<span class="token string">'spam'</span> <span class="token operator">==</span> <span class="token string">'spam'</span>
<span class="token comment"># True</span>
<span class="token string">'spam'</span> <span class="token operator">==</span> <span class="token string">'spam '</span>
<span class="token comment"># False</span>
<span class="token string">'12'</span> <span class="token operator">==</span> <span class="token number">12</span>
<span class="token comment"># False</span>
</code></pre></div><p>Note that each type has to define a function that will be used to evaluate if two values are the same. For builtin types these functions behave as you'd expect, and just evaluate things based on being the same value. However custom types could define equality testing as whatever they'd like, including always returning <code>True</code> or always returning <code>False</code>.</p> <h2 id="comparing-objects"><a href="#comparing-objects" class="header-anchor">#</a> Comparing Objects</h2> <p>In order to compare the equality of custom classes, you can override <code>==</code> and <code>!=</code> by defining <code>__eq__</code> and <code>__ne__</code> methods. You can also override <code>__lt__</code> (<code><</code>), <code>__le__</code> (<code><=</code>), <code>__gt__</code> (<code>></code>), and <code>__ge__</code> (<code>></code>). Note that you only need to override two comparison methods, and Python can handle the rest (<code>==</code> is the same as <code>not <</code> and <code>not ></code>, etc.)</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">class</span> <span class="token class-name">Foo</span><span class="token punctuation">(</span><span class="token builtin">object</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>my_item <span class="token operator">=</span> item
<span class="token keyword">def</span> <span class="token function">__eq__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>my_item <span class="token operator">==</span> other<span class="token punctuation">.</span>my_item
a <span class="token operator">=</span> Foo<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span>
b <span class="token operator">=</span> Foo<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span>
a <span class="token operator">==</span> b <span class="token comment"># True</span>
a <span class="token operator">!=</span> b <span class="token comment"># False</span>
a <span class="token keyword">is</span> b <span class="token comment"># False</span>
</code></pre></div><p>Note that this simple comparison assumes that <code>other</code> (the object being compared to) is the same object type. Comparing to another type will throw an error:</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">class</span> <span class="token class-name">Bar</span><span class="token punctuation">(</span><span class="token builtin">object</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> item<span class="token punctuation">)</span><span class="token punctuation">:</span>
self<span class="token punctuation">.</span>other_item <span class="token operator">=</span> item
<span class="token keyword">def</span> <span class="token function">__eq__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>other_item <span class="token operator">==</span> other<span class="token punctuation">.</span>other_item
<span class="token keyword">def</span> <span class="token function">__ne__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">)</span><span class="token punctuation">:</span>
<span class="token keyword">return</span> self<span class="token punctuation">.</span>other_item <span class="token operator">!=</span> other<span class="token punctuation">.</span>other_item
c <span class="token operator">=</span> Bar<span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span>
a <span class="token operator">==</span> c <span class="token comment"># throws AttributeError: 'Foo' object has no attribute 'other_item'</span>
</code></pre></div><p>Checking <code>isinstance()</code> or similar will help prevent this (if desired).</p> <h2 id="common-gotcha-python-does-not-enforce-typing"><a href="#common-gotcha-python-does-not-enforce-typing" class="header-anchor">#</a> Common Gotcha: Python does not enforce typing</h2> <p>In many other languages, if you run the following
(Java example)</p> <div class="language-py extra-class"><pre class="language-py"><code><span class="token keyword">if</span><span class="token punctuation">(</span><span class="token string">"asgdsrf"</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token operator">//</span>do stuff
<span class="token punctuation">}</span>
</code></pre></div><p>... you'll get an error.
You can't just go comparing strings to integers like that. In Python, this is a perfectly legal statement - it'll just resolve to <code>False</code>.</p> <p>A common gotcha is the following</p> <div class="language-py extra-class"><pre class="language-py"><code>myVariable <span class="token operator">=</span> <span class="token string">"1"</span>
<span class="token keyword">if</span> <span class="token number">1</span> <span class="token operator">==</span> myVariable<span class="token punctuation">:</span>
<span class="token comment">#do stuff</span>
</code></pre></div><p>This comparison will evaluate to <code>False</code> without an error, every time, potentially hiding a bug or breaking a conditional.</p> <h4 id="syntax"><a href="#syntax" class="header-anchor">#</a> Syntax</h4> <li>
!= - Is not equal to
</li> <li>
== - Is equal to
</li> <li>
`>` - greater than
</li> <li>
`<` - less than
</li> <li>
`>=` - greater than or equal to
</li> <li>
`<=` - less than or equal to
</li> <li>
`is` - test if objects are the exact same object
</li> <li>
is not = test if objects are not the exact same object
</li> <h4 id="parameters"><a href="#parameters" class="header-anchor">#</a> Parameters</h4> <table><thead><tr><th>Parameter</th> <th>Details</th></tr></thead> <tbody><tr><td>x</td> <td>First item to be compared</td></tr> <tr><td>y</td> <td>Second item to be compared</td></tr></tbody></table></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/devtut/generate/edit/master/docs/python/comparisons.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
←
<a href="/python/conditionals.html" class="prev">
Conditionals
</a></span> <span class="next"><a href="/python/loops.html">
Loops
</a>
→
</span></p></div> </main></div><div class="global-ui"><!----></div></div>
<script src="/assets/js/app.1779e102.js" defer></script><script src="/assets/js/3.2cfa8016.js" defer></script><script src="/assets/js/2671.1b81052c.js" defer></script>
</body>
</html>