mirror of
https://github.com/rasbt/python_reference.git
synced 2025-01-18 15:27:09 +00:00
list comp update
This commit is contained in:
parent
accaef2177
commit
ba852e3c63
594
.ipynb_checkpoints/python_true_false-checkpoint.ipynb
Normal file
594
.ipynb_checkpoints/python_true_false-checkpoint.ipynb
Normal file
|
@ -0,0 +1,594 @@
|
|||
{
|
||||
"metadata": {
|
||||
"name": ""
|
||||
},
|
||||
"nbformat": 3,
|
||||
"nbformat_minor": 0,
|
||||
"worksheets": [
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Sebastian Raschka, 03/2014 \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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 15,
|
||||
"text": [
|
||||
"False"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 15
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -35,17 +35,9 @@
|
|||
"input": [
|
||||
"import datetime\n",
|
||||
"\n",
|
||||
"print(datetime.time(0,0,0), '(Midnight) evaluates to ', end=\"\")\n",
|
||||
"if not datetime.time(0,0,0):\n",
|
||||
" print(False)\n",
|
||||
"else:\n",
|
||||
" print(True)\n",
|
||||
" \n",
|
||||
"print(datetime.time(1,0,0), '(1 am) evaluates to ', end=\"\")\n",
|
||||
"if not datetime.time(1,0,0):\n",
|
||||
" print(False)\n",
|
||||
"else:\n",
|
||||
" print(True)"
|
||||
"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": {},
|
||||
|
@ -54,12 +46,12 @@
|
|||
"output_type": "stream",
|
||||
"stream": "stdout",
|
||||
"text": [
|
||||
"00:00:00 (Midnight) evaluates to False\n",
|
||||
"01:00:00 (1 am) evaluates to True\n"
|
||||
"\"datetime.time(0,0,0)\" (Midnight) evaluates to False\n",
|
||||
"\"datetime.time(1,0,0)\" (1 am) evaluates to True\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 12
|
||||
"prompt_number": 17
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
|
@ -84,7 +76,7 @@
|
|||
"print('my_true_val == False:', my_true_val == False)\n",
|
||||
"print('my_true_val is False:', my_true_val is False)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"print(my_true_val\n",
|
||||
"if my_true_val:\n",
|
||||
" print('\"if my_true_val:\" is True')\n",
|
||||
"else:\n",
|
||||
|
@ -394,26 +386,59 @@
|
|||
"## 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`. If we want to make a copy of the list values, we have to make a little tweak: `list1 = list2[:]`"
|
||||
"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",
|
||||
"\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_fourth_list = my_first_list[:]\n",
|
||||
"print('my_first_list == my_fourth_list:', my_first_list == my_fourth_list)\n",
|
||||
"print('my_first_list is my_fourth_list:', my_first_list is my_fourth_list)"
|
||||
"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": {},
|
||||
|
@ -426,12 +451,141 @@
|
|||
"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_fourth_list: True\n",
|
||||
"my_first_list is my_fourth_list: False\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": 82
|
||||
"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"
|
||||
]
|
||||
},
|
||||
{
|
||||
"metadata": {},
|
||||
"output_type": "pyout",
|
||||
"prompt_number": 15,
|
||||
"text": [
|
||||
"False"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_number": 15
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"collapsed": false,
|
||||
"input": [],
|
||||
"language": "python",
|
||||
"metadata": {},
|
||||
"outputs": []
|
||||
}
|
||||
],
|
||||
"metadata": {}
|
||||
|
|
Loading…
Reference in New Issue
Block a user