python 如何决定何时按值传递参数以及何时按引用传递参数?
How does python decide when to pass arguments by-value and when by-reference?
在下面的示例中,class 被 "automatically" 传递 "by reference" 并且变量 "by value":
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
为什么会有这样的差异?
它们总是以相同的方式传递。 (这种方式有时称为 "call-by-object",有时称为 "call by value where the value is a reference"。您可以在此处的其他问题中查找。)不同之处在于这两个对象是什么以及您对它们做了什么。
p += 1
本质上告诉p
对象对自己做+= 1
,然后将结果赋值给变量p
。整数不能改变它们的值,因此所有这一切只是将 p
加一并将结果赋给 p
。 p
是一个 "bare name"(即,只是一个普通变量),所以这只是将数字 43 绑定到变量 p
,就是这样。
q.q += 1
告诉 q.q
对自己做 += 1
,并将结果分配给 q.q
。同样,整数不能更改它们的值,因此这会将 q.q
加一。但是 q.q
不是一个裸名;它是一个属性引用。所以 "assigning to q.q
" 意味着 "ask the object q
to assign this new value to its q.
attribute"。由于 q
可以 更改其值(即其属性的值,它确实如此)。
最重要的是,您不能假设代码中的差异是因为两种情况下的参数传递语义不同。参数传递的工作原理相同。但是,您传递的 对象 是不同的(一个是整数,一个是 Q
),这些对象可以以不同的方式处理 +=
等操作.差异不在两种参数传递之间,而是在两种不同的处理方式之间 +=
.
在下面的示例中,class 被 "automatically" 传递 "by reference" 并且变量 "by value":
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
为什么会有这样的差异?
它们总是以相同的方式传递。 (这种方式有时称为 "call-by-object",有时称为 "call by value where the value is a reference"。您可以在此处的其他问题中查找。)不同之处在于这两个对象是什么以及您对它们做了什么。
p += 1
本质上告诉p
对象对自己做+= 1
,然后将结果赋值给变量p
。整数不能改变它们的值,因此所有这一切只是将 p
加一并将结果赋给 p
。 p
是一个 "bare name"(即,只是一个普通变量),所以这只是将数字 43 绑定到变量 p
,就是这样。
q.q += 1
告诉 q.q
对自己做 += 1
,并将结果分配给 q.q
。同样,整数不能更改它们的值,因此这会将 q.q
加一。但是 q.q
不是一个裸名;它是一个属性引用。所以 "assigning to q.q
" 意味着 "ask the object q
to assign this new value to its q.
attribute"。由于 q
可以 更改其值(即其属性的值,它确实如此)。
最重要的是,您不能假设代码中的差异是因为两种情况下的参数传递语义不同。参数传递的工作原理相同。但是,您传递的 对象 是不同的(一个是整数,一个是 Q
),这些对象可以以不同的方式处理 +=
等操作.差异不在两种参数传递之间,而是在两种不同的处理方式之间 +=
.