python如何决定何时按值传递参数以及何时按引用传递参数? [复制]

Posted

技术标签:

【中文标题】python如何决定何时按值传递参数以及何时按引用传递参数? [复制]【英文标题】:How does python decide when to pass arguments by-value and when by-reference? [duplicate] 【发布时间】:2015-10-05 07:41:13 【问题描述】:

在下面的例子中,一个类“自动”通过“引用”传递,一个变量“通过值”传递:

class Q:
    def __init__(self, q):
        self.q = q

p = 42
q = Q(42)

def p_worker(p):
    p += 1
    return p

def q_worker(q):
    q.q += 1
    return q

print p is p_worker(p)
print q is q_worker(q)

输出是:

False
True

为什么会有这样的差异?

【问题讨论】:

一般情况下不可变对象通过值传递,可变对象通过引用传递。 @TigerhawkT3,对象的不变性是在编译时预先确定或评估的吗? (example on Wikipedia 也返回 True...) @TigerhawkT3:这是不正确的。所有对象都以相同的语义传递。只是对于不可变对象,你不能“利用”通过引用传递,因为你不能做任何事情来改变你引用的值。 "How do I pass a variable by reference" 的所有答案也适用于此处,因此我投票决定将其作为重复项关闭。 好的,传递引用在可变对象上很明显,但在不可变对象上不明显。 【参考方案1】:

它们总是以相同的方式传递。 (这种方式有时称为“按对象调用”,有时称为“按值调用,其中值是引用”。您可以在此处的其他问题中查找它。)区别在于两个对象是什么和你对他们做了什么。

p += 1 本质上告诉p 对象对自己执行+= 1,然后将结果分配给变量p。整数不能改变它们的值,所以这一切只是将p 加一并将结果分配给pp 是一个“裸名”(即,只是一个普通变量),所以这只是将数字 43 绑定到变量 p 就是这样。

q.q += 1 告诉q.q 对自己执行+= 1,并将结果分配给q.q。同样,整数不能更改它们的值,因此这会将 q.q 加一。但是q.q 并不是一个简单的名字;它是一个属性引用。所以“分配给q.q”意味着“要求对象q 将这个新值分配给它的q. 属性”。因为q可以改变它的值(也就是说,它的属性的值,它可以)。

最重要的是,您不能假设代码中的差异是因为两种情况下的参数传递语义不同。参数传递的工作原理相同。但是,您传递的对象是不同的(一个是整数,一个是Q),这些对象可以以不同的方式处理+= 之类的操作。差异不在于两种参数传递之间,而是在处理+= 的两种不同方式之间。

【讨论】:

以上是关于python如何决定何时按值传递参数以及何时按引用传递参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

PHP 中的数组是作为值复制还是作为对新变量的引用,以及何时传递给函数?

Python按值传递参数和按引用传递参数

何时使用SESSION以及何时在Web应用程序中使用GET进行参数传递?

C# vs Python 参数传递

delphi的一些语法知识 以及参数传递问题,按引用方式传递参数,按值方式传递参数

将函数参数添加到向量