diff --git a/.ipynb_checkpoints/not_so_obvious_python_stuff-checkpoint.ipynb b/.ipynb_checkpoints/not_so_obvious_python_stuff-checkpoint.ipynb index 28a4c83..bedbf77 100644 --- a/.ipynb_checkpoints/not_so_obvious_python_stuff-checkpoint.ipynb +++ b/.ipynb_checkpoints/not_so_obvious_python_stuff-checkpoint.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:257a5a05fdf9f21f3a395d8edea0d549d6444deac97319a4c0c0d6478c490ece" + "signature": "sha256:65ce88feaf4030991defb4ffc22e758e20be8f6dc5dc3046d5c804aa0089de06" }, "nbformat": 3, "nbformat_minor": 0, @@ -48,7 +48,7 @@ "- [`bool` is a subclass of `int`](#bool_int)\n", "- [About lambda and closures-in-a-loop pitfall](#lambda_closure)\n", "- [Python's LEGB scope resolution and the keywords `global` and `nonlocal`](#python_legb)\n", - "- [When immutable Tuples aren't so immutable](#immutable_tuple)\n", + "- [When mutable contents of immutable tuples aren't so mutable](#immutable_tuple)\n", "- [List comprehensions are fast, but generators are faster!?](#list_generator)" ] }, @@ -830,17 +830,16 @@ "
\n", "
\n", "\n", - "## When immutable Tuples aren't so immutable" + "## When mutable contents of immutable tuples aren't so mutable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "As we all know, tuples are immutable objects in Python, right!?\n", + "As we all know, tuples are immutable objects in Python, right!? But what happens if they contain mutable objects? \n", "\n", - "**Note:** As a careful reader pointed out, \n", - "\"The tuple is still immutable. You were unable to change it's cardinality, or trick it into pointing to a different contained object.\"" + "First, let us have a look at the expected behavior: a `TypeError` is raised if we try to modify a value tuple: " ] }, { @@ -870,7 +869,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### But what if we put a mutable object into the immutable tuple? Well, modification works, but we **also** get a type error, funny, isn't it?" + "#### But what if we put a mutable object into the immutable tuple? Well, modification works, but we **also** get a `TypeError` at the same time." ] }, { @@ -929,7 +928,7 @@ "source": [ "
\n", "
\n", - "However, there **IS** a way (where there should be none!) to modify our immutable tuple without raising the `TypeError`, the solution is the `.extend()`:" + "However, **there are ways** to modify the mutable contents of the tuple without raising the `TypeError`, the solution is the `.extend()` method, or alternatively `.append()` (for lists):" ] }, { @@ -955,6 +954,29 @@ ], "prompt_number": 44 }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "tup = ([],)\n", + "print('tup before: ', tup)\n", + "tup[0].append(1)\n", + "print('tup after: ', tup)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "tup before: ([],)\n", + "tup after: ([1],)\n" + ] + } + ], + "prompt_number": 5 + }, { "cell_type": "markdown", "metadata": {}, diff --git a/not_so_obvious_python_stuff.ipynb b/not_so_obvious_python_stuff.ipynb index 28a4c83..bedbf77 100644 --- a/not_so_obvious_python_stuff.ipynb +++ b/not_so_obvious_python_stuff.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "", - "signature": "sha256:257a5a05fdf9f21f3a395d8edea0d549d6444deac97319a4c0c0d6478c490ece" + "signature": "sha256:65ce88feaf4030991defb4ffc22e758e20be8f6dc5dc3046d5c804aa0089de06" }, "nbformat": 3, "nbformat_minor": 0, @@ -48,7 +48,7 @@ "- [`bool` is a subclass of `int`](#bool_int)\n", "- [About lambda and closures-in-a-loop pitfall](#lambda_closure)\n", "- [Python's LEGB scope resolution and the keywords `global` and `nonlocal`](#python_legb)\n", - "- [When immutable Tuples aren't so immutable](#immutable_tuple)\n", + "- [When mutable contents of immutable tuples aren't so mutable](#immutable_tuple)\n", "- [List comprehensions are fast, but generators are faster!?](#list_generator)" ] }, @@ -830,17 +830,16 @@ "
\n", "
\n", "\n", - "## When immutable Tuples aren't so immutable" + "## When mutable contents of immutable tuples aren't so mutable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "As we all know, tuples are immutable objects in Python, right!?\n", + "As we all know, tuples are immutable objects in Python, right!? But what happens if they contain mutable objects? \n", "\n", - "**Note:** As a careful reader pointed out, \n", - "\"The tuple is still immutable. You were unable to change it's cardinality, or trick it into pointing to a different contained object.\"" + "First, let us have a look at the expected behavior: a `TypeError` is raised if we try to modify a value tuple: " ] }, { @@ -870,7 +869,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### But what if we put a mutable object into the immutable tuple? Well, modification works, but we **also** get a type error, funny, isn't it?" + "#### But what if we put a mutable object into the immutable tuple? Well, modification works, but we **also** get a `TypeError` at the same time." ] }, { @@ -929,7 +928,7 @@ "source": [ "
\n", "
\n", - "However, there **IS** a way (where there should be none!) to modify our immutable tuple without raising the `TypeError`, the solution is the `.extend()`:" + "However, **there are ways** to modify the mutable contents of the tuple without raising the `TypeError`, the solution is the `.extend()` method, or alternatively `.append()` (for lists):" ] }, { @@ -955,6 +954,29 @@ ], "prompt_number": 44 }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "tup = ([],)\n", + "print('tup before: ', tup)\n", + "tup[0].append(1)\n", + "print('tup after: ', tup)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "tup before: ([],)\n", + "tup after: ([1],)\n" + ] + } + ], + "prompt_number": 5 + }, { "cell_type": "markdown", "metadata": {},