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
加一并将结果分配给p
。 p
是一个“裸名”(即,只是一个普通变量),所以这只是将数字 43 绑定到变量 p
就是这样。
q.q += 1
告诉q.q
对自己执行+= 1
,并将结果分配给q.q
。同样,整数不能更改它们的值,因此这会将 q.q
加一。但是q.q
并不是一个简单的名字;它是一个属性引用。所以“分配给q.q
”意味着“要求对象q
将这个新值分配给它的q.
属性”。因为q
可以改变它的值(也就是说,它的属性的值,它可以)。
最重要的是,您不能假设代码中的差异是因为两种情况下的参数传递语义不同。参数传递的工作原理相同。但是,您传递的对象是不同的(一个是整数,一个是Q
),这些对象可以以不同的方式处理+=
之类的操作。差异不在于两种参数传递之间,而是在处理+=
的两种不同方式之间。
【讨论】:
以上是关于python如何决定何时按值传递参数以及何时按引用传递参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
PHP 中的数组是作为值复制还是作为对新变量的引用,以及何时传递给函数?
何时使用SESSION以及何时在Web应用程序中使用GET进行参数传递?