关于boolean:Python的bool是否通过值传递?

Are Python's bools passed by value?

我发送了一个对bool对象的引用,并在一个方法中对其进行了修改。方法执行完毕后,方法外部的bool值不变。

这让我相信python的bools是按值传递的。是真的吗?其他的python类型的行为方式是什么?


Python变量不是C++意义上的"引用"。相反,它们只是绑定到内存中任意位置的对象的本地名称。如果该对象本身是可变的,则对其所做的更改将在已将名称绑定到该对象的其他作用域中可见。然而,许多原始类型(包括boolintstrtuple是不变的。不能就地更改它们的值;相反,可以在本地作用域中将新值赋给相同的名称。

事实上,几乎任何时候*你看到foo = X形式的代码,这意味着名称foo在你当前的本地名称空间中被分配了一个新的值(X),而不是由foo命名的内存中的一个位置正在更新其内部指针来引用X的位置。

*-在python中唯一的例外是属性的setter方法,它允许您编写obj.foo = X,并让它在后台重写,以调用类似obj.setFoo(X)的方法。


要记住的是,在Python中,函数或方法无法在调用命名空间中重新绑定名称。当你写"我发送了一个对bool对象的引用,并在一个方法中修改了它"时,你实际做的(我猜)是在方法体中重新绑定参数名(bool值被调用绑定到该参数名)。


它取决于对象是可变的还是不可变的。不可变对象的行为就像您在bool中看到的那样,而可变对象则会发生变化。

参考:http://www.testingreflections.com/node/view/5126

Python passes references-to-objects by value (like Java), and everything in Python is an object. This sounds simple, but then you will notice that some data types seem to exhibit pass-by-value characteristics, while others seem to act like pass-by-reference... what's the deal?

It is important to understand mutable and immutable objects. Some objects, like strings, tuples, and numbers, are immutable. Altering them inside a function/method will create a new instance and the original instance outside the function/method is not changed. Other objects, like lists and dictionaries are mutable, which means you can change the object in-place. Therefore, altering an object inside a function/method will also change the original object outside.


简而言之,python中没有变量;有对象(如true和false,bools恰好是不可变的)和名称。名称是您所调用的变量,但名称属于一个作用域,通常不能更改本地名称以外的名称。