]> granicus.if.org Git - python/commitdiff
Issue #16225: Add additional note to tutorial about changing sequence while looping.
authorChris Jerdonek <chris.jerdonek@gmail.com>
Tue, 16 Oct 2012 02:44:47 +0000 (19:44 -0700)
committerChris Jerdonek <chris.jerdonek@gmail.com>
Tue, 16 Oct 2012 02:44:47 +0000 (19:44 -0700)
Doc/tutorial/controlflow.rst
Doc/tutorial/datastructures.rst

index 1564e96c300962e38571e06fa1782bf37f050e78..574f0d05f697a281ab448434caf1ee6022ae3ae7 100644 (file)
@@ -58,24 +58,24 @@ they appear in the sequence.  For example (no pun intended):
 ::
 
    >>> # Measure some strings:
-   ... a = ['cat', 'window', 'defenestrate']
-   >>> for x in a:
-   ...     print(x, len(x))
+   ... words = ['cat', 'window', 'defenestrate']
+   >>> for w in words:
+   ...     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
 
-It is not safe to modify the sequence being iterated over in the loop (this can
-only happen for mutable sequence types, such as lists).  If you need to modify
-the list you are iterating over (for example, to duplicate selected items) you
-must iterate over a copy.  The slice notation makes this particularly
-convenient::
+If you need to modify the sequence you are iterating over while inside the loop
+(for example to duplicate selected items), it is recommended that you first
+make a copy.  Iterating over a sequence does not implicitly make a copy.  The
+slice notation makes this especially convenient::
 
-   >>> for x in a[:]: # make a slice copy of the entire list
-   ...    if len(x) > 6: a.insert(0, x)
+   >>> for w in words[:]:  # Loop over a slice copy of the entire list.
+   ...     if len(w) > 6:
+   ...         words.insert(0, w)
    ...
-   >>> a
+   >>> words
    ['defenestrate', 'cat', 'window', 'defenestrate']
 
 
index 12b5c57aa5530e4b66c1a7fbf06da50ad4ef12e7..e008dd8ed356fa2ed7934e75d795843c6ad7d95f 100644 (file)
@@ -584,6 +584,19 @@ returns a new sorted list while leaving the source unaltered. ::
    orange
    pear
 
+To change a sequence you are iterating over while inside the loop (for
+example to duplicate certain items), it is recommended that you first make
+a copy.  Looping over a sequence does not implicitly make a copy.  The slice
+notation makes this especially convenient::
+
+   >>> words = ['cat', 'window', 'defenestrate']
+   >>> for w in words[:]:  # Loop over a slice copy of the entire list.
+   ...     if len(w) > 6:
+   ...         words.insert(0, w)
+   ...
+   >>> words
+   ['defenestrate', 'cat', 'window', 'defenestrate']
+
 
 .. _tut-conditions: