]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-30826: Improve control flow examples (GH-15407) (GH-15410)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 23 Aug 2019 06:52:12 +0000 (23:52 -0700)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>
Fri, 23 Aug 2019 06:52:12 +0000 (23:52 -0700)
(cherry picked from commit 6fcb6cfb139ade1aac6dbee0b18ca72b18cbe0d2)

Co-authored-by: Raymond Hettinger <rhettinger@users.noreply.github.com>
Doc/tutorial/controlflow.rst

index 92c042e26dfbf9f3704157dfbca17209e2375cf9..b7e003c550188a25837ccbeaa42ad643ff38eabb 100644 (file)
@@ -66,20 +66,20 @@ they appear in the sequence.  For example (no pun intended):
    window 6
    defenestrate 12
 
-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 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']
-
-With ``for w in words:``, the example would attempt to create an infinite list,
-inserting ``defenestrate`` over and over again.
+Code that modifies a collection while iterating over that same collection can
+be tricky to get right.  Instead, it is usually more straight-forward to loop
+over a copy of the collection or to create a new collection::
+
+    # Strategy:  Iterate over a copy
+    for user, status in users.copy().items():
+        if status == 'inactive':
+            del users[user]
+
+    # Strategy:  Create a new collection
+    active_users = {}
+    for user, status in users.items():
+        if status == 'active':
+            active_users[user] = status
 
 
 .. _tut-range: