{
 "metadata": {
  "name": "",
  "signature": "sha256:f6d59feb844af096c0581919fa052e8f29f4fa0aaa81752f5e50241ab084a0e9"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "[Sebastian Raschka](http://sebastianraschka.com)  \n",
      "last updated: 05/03/2014\n",
      "\n",
      "- [Link to this IPython Notebook on GitHub](https://github.com/rasbt/python_reference/blob/master/benchmarks/python_true_false.ipynb)  \n",
      "- [Link to the GitHub repository](https://github.com/rasbt/python_reference)  \n",
      "\n",
      "Code was executed in Python 3.4.0"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###`True` and `False` in the `datetime` module\n",
      "\n",
      "Pointed out in a nice article **\"A false midnight\"** at [http://lwn.net/SubscriberLink/590299/bf73fe823974acea/](http://lwn.net/SubscriberLink/590299/bf73fe823974acea/):\n",
      "\n",
      "*\"it often comes as a big surprise for programmers to find (sometimes by way of a hard-to-reproduce bug) that,   \n",
      "unlike any other time value, midnight (i.e. datetime.time(0,0,0)) is False.  \n",
      "A long discussion on the python-ideas mailing list shows that, while surprising,  \n",
      "that behavior is desirable\u2014at least in some quarters.\"*"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import datetime\n",
      "\n",
      "print('\"datetime.time(0,0,0)\" (Midnight) evaluates to', bool(datetime.time(0,0,0)))\n",
      "\n",
      "print('\"datetime.time(1,0,0)\" (1 am) evaluates to', bool(datetime.time(1,0,0)))"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\"datetime.time(0,0,0)\" (Midnight) evaluates to False\n",
        "\"datetime.time(1,0,0)\" (1 am) evaluates to True\n"
       ]
      }
     ],
     "prompt_number": 17
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Boolean `True`"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_true_val = True\n",
      "\n",
      "\n",
      "print('my_true_val == True:', my_true_val == True)\n",
      "print('my_true_val is True:', my_true_val is True)\n",
      "\n",
      "print('my_true_val == None:', my_true_val == None)\n",
      "print('my_true_val is None:', my_true_val is None)\n",
      "\n",
      "print('my_true_val == False:', my_true_val == False)\n",
      "print('my_true_val is False:', my_true_val is False)\n",
      "\n",
      "print(my_true_val\n",
      "if my_true_val:\n",
      "    print('\"if my_true_val:\" is True')\n",
      "else:\n",
      "    print('\"if my_true_val:\" is False')\n",
      "    \n",
      "if not my_true_val:\n",
      "    print('\"if not my_true_val:\" is True')\n",
      "else:\n",
      "    print('\"if not my_true_val:\" is False')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_true_val == True: True\n",
        "my_true_val is True: True\n",
        "my_true_val == None: False\n",
        "my_true_val is None: False\n",
        "my_true_val == False: False\n",
        "my_true_val is False: False\n",
        "\"if my_true_val:\" is True\n",
        "\"if not my_true_val:\" is False\n"
       ]
      }
     ],
     "prompt_number": 83
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Boolean `False`"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_false_val = False\n",
      "\n",
      "\n",
      "print('my_false_val == True:', my_false_val == True)\n",
      "print('my_false_val is True:', my_false_val is True)\n",
      "\n",
      "print('my_false_val == None:', my_false_val == None)\n",
      "print('my_false_val is None:', my_false_val is None)\n",
      "\n",
      "print('my_false_val == False:', my_false_val == False)\n",
      "print('my_false_val is False:', my_false_val is False)\n",
      "\n",
      "\n",
      "if my_false_val:\n",
      "    print('\"if my_false_val:\" is True')\n",
      "else:\n",
      "    print('\"if my_false_val:\" is False')\n",
      "    \n",
      "if not my_false_val:\n",
      "    print('\"if not my_false_val:\" is True')\n",
      "else:\n",
      "    print('\"if not my_false_val:\" is False')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_false_val == True: False\n",
        "my_false_val is True: False\n",
        "my_false_val == None: False\n",
        "my_false_val is None: False\n",
        "my_false_val == False: True\n",
        "my_false_val is False: True\n",
        "\"if my_false_val:\" is False\n",
        "\"if not my_false_val:\" is True\n"
       ]
      }
     ],
     "prompt_number": 76
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## `None` 'value'"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_none_var = None\n",
      "\n",
      "print('my_none_var == True:', my_none_var == True)\n",
      "print('my_none_var is True:', my_none_var is True)\n",
      "\n",
      "print('my_none_var == None:', my_none_var == None)\n",
      "print('my_none_var is None:', my_none_var is None)\n",
      "\n",
      "print('my_none_var == False:', my_none_var == False)\n",
      "print('my_none_var is False:', my_none_var is False)\n",
      "\n",
      "\n",
      "if my_none_var:\n",
      "    print('\"if my_none_var:\" is True')\n",
      "else:\n",
      "    print('\"if my_none_var:\" is False')\n",
      "\n",
      "if not my_none_var:\n",
      "    print('\"if not my_none_var:\" is True')\n",
      "else:\n",
      "    print('\"if not my_none_var:\" is False')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_none_var == True: False\n",
        "my_none_var is True: False\n",
        "my_none_var == None: True\n",
        "my_none_var is None: True\n",
        "my_none_var == False: False\n",
        "my_none_var is False: False\n",
        "\"if my_none_var:\" is False\n",
        "\"if not my_none_var:\" is True\n"
       ]
      }
     ],
     "prompt_number": 62
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Empty String"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_empty_string = \"\"\n",
      "\n",
      "print('my_empty_string == True:', my_empty_string == True)\n",
      "print('my_empty_string is True:', my_empty_string is True)\n",
      "\n",
      "print('my_empty_string == None:', my_empty_string == None)\n",
      "print('my_empty_string is None:', my_empty_string is None)\n",
      "\n",
      "print('my_empty_string == False:', my_empty_string == False)\n",
      "print('my_empty_string is False:', my_empty_string is False)\n",
      "\n",
      "\n",
      "if my_empty_string:\n",
      "    print('\"if my_empty_string:\" is True')\n",
      "else:\n",
      "    print('\"if my_empty_string:\" is False')\n",
      "    \n",
      "if not my_empty_string:\n",
      "    print('\"if not my_empty_string:\" is True')\n",
      "else:\n",
      "    print('\"if not my_empty_string:\" is False')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_empty_string == True: False\n",
        "my_empty_string is True: False\n",
        "my_empty_string == None: False\n",
        "my_empty_string is None: False\n",
        "my_empty_string == False: False\n",
        "my_empty_string is False: False\n",
        "\"if my_empty_string:\" is False\n",
        "\"if my_empty_string:\" is True\n"
       ]
      }
     ],
     "prompt_number": 61
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## Empty List\n",
      "It is generally not a good idea to use the `==` to check for empty lists..."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_empty_list = []\n",
      "\n",
      "\n",
      "print('my_empty_list == True:', my_empty_list == True)\n",
      "print('my_empty_list is True:', my_empty_list is True)\n",
      "\n",
      "print('my_empty_list == None:', my_empty_list == None)\n",
      "print('my_empty_list is None:', my_empty_list is None)\n",
      "\n",
      "print('my_empty_list == False:', my_empty_list == False)\n",
      "print('my_empty_list is False:', my_empty_list is False)\n",
      "\n",
      "\n",
      "if my_empty_list:\n",
      "    print('\"if my_empty_list:\" is True')\n",
      "else:\n",
      "    print('\"if my_empty_list:\" is False')\n",
      "    \n",
      "if not my_empty_list:\n",
      "    print('\"if not my_empty_list:\" is True')\n",
      "else:\n",
      "    print('\"if not my_empty_list:\" is False')\n",
      "\n",
      "\n",
      "    \n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_empty_list == True: False\n",
        "my_empty_list is True: False\n",
        "my_empty_list == None: False\n",
        "my_empty_list is None: False\n",
        "my_empty_list == False: False\n",
        "my_empty_list is False: False\n",
        "\"if my_empty_list:\" is False\n",
        "\"if not my_empty_list:\" is True\n"
       ]
      }
     ],
     "prompt_number": 67
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## [0]-List"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_zero_list = [0]\n",
      "\n",
      "\n",
      "print('my_zero_list == True:', my_zero_list == True)\n",
      "print('my_zero_list is True:', my_zero_list is True)\n",
      "\n",
      "print('my_zero_list == None:', my_zero_list == None)\n",
      "print('my_zero_list is None:', my_zero_list is None)\n",
      "\n",
      "print('my_zero_list == False:', my_zero_list == False)\n",
      "print('my_zero_list is False:', my_zero_list is False)\n",
      "\n",
      "\n",
      "if my_zero_list:\n",
      "    print('\"if my_zero_list:\" is True')\n",
      "else:\n",
      "    print('\"if my_zero_list:\" is False')\n",
      "    \n",
      "if not my_zero_list:\n",
      "    print('\"if not my_zero_list:\" is True')\n",
      "else:\n",
      "    print('\"if not my_zero_list:\" is False')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_zero_list == True: False\n",
        "my_zero_list is True: False\n",
        "my_zero_list == None: False\n",
        "my_zero_list is None: False\n",
        "my_zero_list == False: False\n",
        "my_zero_list is False: False\n",
        "\"if my_zero_list:\" is True\n",
        "\"if not my_zero_list:\" is False\n"
       ]
      }
     ],
     "prompt_number": 70
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "## List comparison  \n",
      "List comparisons are a handy way to show the difference between `==` and `is`.  \n",
      "While `==` is rather evaluating the equality of the value, `is` is checking if two objects are equal.\n",
      "The examples below show that we can assign a pointer to the same list object by using `=`, e.g., `list1 = list2`.   \n",
      "a) If we want to make a **shallow** copy of the list values, we have to make a little tweak: `list1 = list2[:]`, or  \n",
      "b) a **deepcopy** via `list1 = copy.deepcopy(list2)`\n",
      "\n",
      "Possibly the best explanation of shallow vs. deep copies I've read so far:\n",
      "\n",
      "***\"Shallow copies duplicate as little as possible. A shallow copy of a collection is a copy of the collection structure, not the elements. With a shallow copy, two collections now share the individual elements.\n",
      "Deep copies duplicate everything. A deep copy of a collection is two collections with all of the elements in the original collection duplicated.\"***  \n",
      "\n",
      "(via [S.Lott](http://stackoverflow.com/users/10661/s-lott) on [StackOverflow](http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy))"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "###a) Shallow vs. deep copies for simple elements  \n",
      "List modification of the original list doesn't affect  \n",
      "shallow copies or deep copies if the list contains literals."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from copy import deepcopy\n",
      "\n",
      "my_first_list = [1]\n",
      "my_second_list = [1]\n",
      "print('my_first_list == my_second_list:', my_first_list == my_second_list)\n",
      "print('my_first_list is my_second_list:', my_first_list is my_second_list)\n",
      "\n",
      "my_third_list = my_first_list\n",
      "print('my_first_list == my_third_list:', my_first_list == my_third_list)\n",
      "print('my_first_list is my_third_list:', my_first_list is my_third_list)\n",
      "\n",
      "my_shallow_copy = my_first_list[:]\n",
      "print('my_first_list == my_shallow_copy:', my_first_list == my_shallow_copy)\n",
      "print('my_first_list is my_shallow_copy:', my_first_list is my_shallow_copy)\n",
      "\n",
      "my_deep_copy = deepcopy(my_first_list)\n",
      "print('my_first_list == my_deep_copy:', my_first_list == my_deep_copy)\n",
      "print('my_first_list is my_deep_copy:', my_first_list is my_deep_copy)\n",
      "\n",
      "print('\\nmy_third_list:', my_third_list)\n",
      "print('my_shallow_copy:', my_shallow_copy)\n",
      "print('my_deep_copy:', my_deep_copy)\n",
      "\n",
      "my_first_list[0] = 2\n",
      "print('after setting \"my_first_list[0] = 2\"')\n",
      "print('my_third_list:', my_third_list)\n",
      "print('my_shallow_copy:', my_shallow_copy)\n",
      "print('my_deep_copy:', my_deep_copy)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_first_list == my_second_list: True\n",
        "my_first_list is my_second_list: False\n",
        "my_first_list == my_third_list: True\n",
        "my_first_list is my_third_list: True\n",
        "my_first_list == my_shallow_copy: True\n",
        "my_first_list is my_shallow_copy: False\n",
        "my_first_list == my_deep_copy: True\n",
        "my_first_list is my_deep_copy: False\n",
        "\n",
        "my_third_list: [1]\n",
        "my_shallow_copy: [1]\n",
        "my_deep_copy: [1]\n",
        "after setting \"my_first_list[0] = 2\"\n",
        "my_third_list: [2]\n",
        "my_shallow_copy: [1]\n",
        "my_deep_copy: [1]\n"
       ]
      }
     ],
     "prompt_number": 11
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "### b) Shallow vs. deep copies if list contains other structures and objects\n",
      "List modification of the original list does affect  \n",
      "shallow copies, but not deep copies if the list contains compound objects."
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "my_first_list = [[1],[2]]\n",
      "my_second_list = [[1],[2]]\n",
      "print('my_first_list == my_second_list:', my_first_list == my_second_list)\n",
      "print('my_first_list is my_second_list:', my_first_list is my_second_list)\n",
      "\n",
      "my_third_list = my_first_list\n",
      "print('my_first_list == my_third_list:', my_first_list == my_third_list)\n",
      "print('my_first_list is my_third_list:', my_first_list is my_third_list)\n",
      "\n",
      "my_shallow_copy = my_first_list[:]\n",
      "print('my_first_list == my_shallow_copy:', my_first_list == my_shallow_copy)\n",
      "print('my_first_list is my_shallow_copy:', my_first_list is my_shallow_copy)\n",
      "\n",
      "my_deep_copy = deepcopy(my_first_list)\n",
      "print('my_first_list == my_deep_copy:', my_first_list == my_deep_copy)\n",
      "print('my_first_list is my_deep_copy:', my_first_list is my_deep_copy)\n",
      "\n",
      "print('\\nmy_third_list:', my_third_list)\n",
      "print('my_shallow_copy:', my_shallow_copy)\n",
      "print('my_deep_copy:', my_deep_copy)\n",
      "\n",
      "my_first_list[0][0] = 2\n",
      "print('after setting \"my_first_list[0][0] = 2\"')\n",
      "print('my_third_list:', my_third_list)\n",
      "print('my_shallow_copy:', my_shallow_copy)\n",
      "print('my_deep_copy:', my_deep_copy)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "my_first_list == my_second_list: True\n",
        "my_first_list is my_second_list: False\n",
        "my_first_list == my_third_list: True\n",
        "my_first_list is my_third_list: True\n",
        "my_first_list == my_shallow_copy: True\n",
        "my_first_list is my_shallow_copy: False\n",
        "my_first_list == my_deep_copy: True\n",
        "my_first_list is my_deep_copy: False\n",
        "\n",
        "my_third_list: [[1], [2]]\n",
        "my_shallow_copy: [[1], [2]]\n",
        "my_deep_copy: [[1], [2]]\n",
        "after setting \"my_first_list[0][0] = 2\"\n",
        "my_third_list: [[2], [2]]\n",
        "my_shallow_copy: [[2], [2]]\n",
        "my_deep_copy: [[1], [2]]\n"
       ]
      }
     ],
     "prompt_number": 13
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Some Python oddity:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "a = 1\n",
      "b = 1\n",
      "print('a is b', bool(a is b))\n",
      "True\n",
      "\n",
      "a = 999\n",
      "b = 999\n",
      "print('a is b', bool(a is b))\n"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "a is b True\n",
        "a is b False\n"
       ]
      }
     ],
     "prompt_number": 1
    }
   ],
   "metadata": {}
  }
 ]
}