擅长:python、mysql、java
<p>这个问题没有出现。<em>所有</em>都以完全相同的方式传递,无论类型、值、操作系统、月相等等</p>
<p>这种类型的参数传递是否最好地描述为按值传递、按引用传递还是其他方式,有待商榷(不过请注意,使用“传递值/引用”需要“值”/“引用”的非标准定义,这是“传递对象”等其他术语的主要理由)。这里没关系。总是一样的。在</p>
<p><strong>编辑:</strong>在您的示例中,<code>handler</code>的语义不会根据参数类型而改变。其中一个被分配给变量(又称名称):</p>
<pre><code>def my_handler(x):
x = <whatever>
</code></pre>
<p>。。。但是<code>my_handler(<anything>)</code>不会改变参数所指的对象(如果传入局部变量、对象属性、更复杂表达式的结果或其他任何内容,也无所谓)。顺便说一句,所有东西都是一个对象,你的人为区分(“原子”、“指向函数的指针”)毫无意义。在</p>
<p>或者,函数(尝试)更改对象的<em>值(例如,向集合添加/删除项、更改对象属性、调用更改可间接观察到的某些状态的方法)。如果对象不支持它(例如调用一个不存在的方法),这可能会引发异常,但这发生在任何访问中,而不仅仅是变异。如果对象的值确实发生了更改,则通过对该对象的引用,<em>始终</em>可见。由于对现有对象的新引用是在许多情况下创建的(例如参数传递、变量赋值、属性赋值等),您可以通过在一个位置更改其值并在另一个位置观察更改来观察对象没有被复制。这对所有对象都适用(同样,前提是您可以更改对象的值)。在</p>
<p>现在,有些对象是不可变的,这(根据定义)意味着您不能更改它们的值,因此不能以这种方式观察对象“共享”(您可以用其他方式观察它)。这并不意味着赋值根据可变性有不同的语义(事实并非如此),它只是意味着你可以用可变对象做一些你不能用不变对象做的事情。您可以对这两个对象执行的操作对两者都是相同的。在</p>