<h2>就地修改与返回修改后的副本</h2>
<p>假设您有一个名为“<code>CookieJar</code>”的容器类</p>
<p><code>CookieJar</code>有一个名为<code>insert()</code>的方法</p>
<p>假设我们执行以下代码:</p>
<pre class="lang-python prettyprint-override"><code>cj = CookieJar()
# [some time later...]
output = cj.insert("new cookie")
</code></pre>
<h3>问题:</h3>
<ul>
<li><code>cj</code>是否与调用<code>insert()</code>方法之前相同</李>
<li>在<code>output</code>中究竟存储了什么</李>
</ul>
<p>在计算机编程中,有两种方法可以修改cookie jar的内容:</p>
<div class="s-table-container">
^{tb1}$
</div>
<p>计算机程序员最常犯的错误之一是,他们假设一个变种人将返回一个修改过的容器副本</p>
<pre class="lang-python prettyprint-override"><code>from collections import deque
my_deque = deque()
my_deque.appendleft("a")
my_deque.appendleft("b")
my_deque.appendleft("c")
print(my_deque)
output = my_deque.reverse()
print(output)
# output == None
</code></pre>
<p><code>deque</code>类的<code>reverse()</code>方法在适当的位置修改<code>deques</code>。<br/>
<code>reverse()</code>输出<code>None</code></p>
<pre class="lang-python prettyprint-override"><code>txt = " kiwi "
print("BEFORE `rstrip` txt is: ", repr(txt))
# ABOUT RSTRIP():
# RSTRIP()` removes `\n`, `\r` `\t`, space, etc...
# from the right-hand side of the string
output = txt.rstrip()
print("output is:", repr(output))
print("AFTER EXECUTING `rstrip()`, txt is: ", repr(txt))
</code></pre>
<div class="s-table-container">
^{tb2}$
</div>
<p>计算机程序员对于他们选择使用哪种范式并不一致</p>
<p>来自<code>collections</code>库的<code>deque</code>类的mutator方法修改了<code>deque</code>的位置</p>
<p>字符串类<code>str</code>的python mutator方法永远不要修改原始字符串</p>