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 加一并将结果赋给 pp 是一个 "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),这些对象可以以不同的方式处理 += 等操作.差异不在两种参数传递之间,而是在两种不同的处理方式之间 +=.