擅长:python、mysql、java
<p>考虑这个例子:</p>
<pre><code>def modify(arr):
arr.remove(4)
numbers = [1, 2, 3, 7, 3, 4]
modify(numbers)
print(numbers) # prints [1, 2, 3, 7, 3] (modified)
</code></pre>
<p>您可能期望参数传递给函数的行为类似于整数:</p>
<pre><code>def modify(i):
i = 6
j = 7
modify(j)
print(j) # prints 7 (not modified)
</code></pre>
<p>您可能认为Python总是复制参数以在函数中使用,但事实并非如此。执行<code>i = 6</code>操作时,将变量名<code>i</code>设置为引用值为<code>6</code>的新对象。因此,不会修改全局<code>i</code>。你知道吗</p>
<p>但是,当您使用<code>list.remove(x)</code>时,您正在修改作为参数传递的实际对象。名为<code>list</code>的变量仍然引用原始对象。你知道吗</p>
<p>当然,这个解释可能会让人很困惑。添加一些<code>id()</code>将有助于澄清问题。你知道吗</p>
<pre><code>def modify(arr):
print(id(arr))
arr.remove(4)
print(id(arr)) # they print the same thing
numbers = [1, 2, 3, 7, 3, 4]
modify(numbers)
print(numbers) # prints [1, 2, 3, 7, 3] (modified)
</code></pre>
<p>现在使用整数:</p>
<pre><code>def modify(i):
print(id(i))
i = 6
print(id(i)) # nope, different ids!
j = 7
modify(j)
print(j) # prints 7 (not modified)
</code></pre>