From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Aug 2019 06:52:12 +0000 (-0700) Subject: bpo-30826: Improve control flow examples (GH-15407) (GH-15410) X-Git-Tag: v3.8.0b4~68 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b6341e676af2f58f3ad9b51a0d2fb7db5a3428e3;p=thirdparty%2FPython%2Fcpython.git bpo-30826: Improve control flow examples (GH-15407) (GH-15410) (cherry picked from commit 6fcb6cfb139ade1aac6dbee0b18ca72b18cbe0d2) Co-authored-by: Raymond Hettinger --- diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 92c042e26dfb..b7e003c55018 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -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: