擅长:python、mysql、java
<p>Python从不进行复制,除非您明确要求它进行复制。这是一个非常简单,清晰,完全可以理解的规则。在它上面加上例外和区别,例如“除非在列表理解中的以下情况下……”,这将是完全愚蠢的:如果Python的设计曾经由一个有着如此疯狂想法的人管理,那么Python将是一种病态的、扭曲的、半衰不振的语言,不值得学习。感谢你让我再一次感到快乐,因为我意识到这绝对是不可能的!在</p>
<p>你要复印吗?<strong>制作</strong>副本!这是Python中的解决方案,因为您需要执行一些不能反映在原始版本中的更改,而您更喜欢副本的开销。也就是说,在一个干净的方法中,你应该这样做</p>
<pre><code>dcopy = list(d)
[dcopy.pop() for _ in range(len(d))]
</code></pre>
<p>如果您非常希望在一个表达式中包含所有内容,您可以这样做,尽管它可能不是人们所称的“干净”的代码:</p>
^{pr2}$
<p>也就是说,当你真的想把一个赋值折叠成一个列表理解时,通常使用的技巧是(添加一个<code>for</code>子句,其中“control variable”是你想要赋值的名称,“loop”是你想要赋值的一个单项序列)。在</p>
<p>函数式语言从不改变数据,因此它们也不需要复制(也不需要)。Python不是一种函数式语言,但是在Python“函数式的方式”中,当然有很多事情可以用Python“函数式的方式”来实现,而且通常这是一种更好的方法。例如,对于你的列表理解来说,一个更好的替代品(保证有相同的结果并且不会影响<code>d</code>,而且<strong>非常</strong>更快、更简洁、更干净):</p>
<pre><code>d[::-1]
</code></pre>
<p>(又名“火星笑脸”,根据我妻子安娜的说法;-)。切片(不是slice<strong>赋值</strong>,这是一个不同的操作)总是在核心Python(语言和标准库)中执行一个拷贝,当然不一定是在独立开发的第三方模块中执行的,比如流行的<code>numpy</code>(它更喜欢将切片看作原始<code>numpy.array</code>上的“视图”)。在</p>