我发送到布尔对象的引用,并且我修改它的方法之内。之后,该方法结束它的执行,所述方法外的布尔值未改变。

这使我相信,Python的布尔变量是按值传递。真的吗?什么其他Python类型的行为是那样的?

有帮助吗?

解决方案

的Python变量不是在C ++有义“的引用”。相反,他们只是在内存的任意位置绑定到一个对象的本地名称。如果该对象本身是可变的,变化它会在已经结合一个名字对象其他范围可见。许多原语类型(包括boolintstr,和tuple)是不可变但是。你不能改变自己的就地值;相反,你在本地范围内指定一个新的值相同的名称。

事实上,几乎所有的时间*您看到的形式foo = X的代码,这意味着该名foo被指派当前的局部名字空间中的一个新的值(X),而不是通过foo名为存储器中的位置是有其内部指针更新代替指X的位置。

* - 在唯一的例外在Python为属性setter方法,这可以允许你写obj.foo = X,并将它在后台重写,改为调用像obj.setFoo(X)的方法

其他提示

这取决于对象是否是可变的或不可变的。不可变对象的行为就像你与布尔所看到的,而可变对象将发生变化。

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

  

的Python经过值(如Java)的引用到对象,并且一切在Python是一个对象。这听起来很简单,但是你会发现,一些数据类型似乎表现出传递的价值特性,而其他人似乎像传递通过引用......这是怎么回事?

     

要理解可变和不可变对象是非常重要的。一些物体,如字符串,元组和数字,是不可改变的。改变他们的函数/法里将创造一个新的实例和功能外原始实例/方法没有改变。其他对象,如列表和字典是可变的,这意味着你可以就地改变对象。因此,改变函数内的对象/方法也将外部改变原始对象。

要记住的是,有在Python中没有的方式函数或在调用命名空间来重新绑定的名称的方法。当你写“我发送到布尔对象的引用,我修改了它的方法内”,你实际上已经发生(我猜)是重新绑定参数名称(这是该布尔值由呼叫方向)内方法主体。

在短,没有变量在Python ;有对象(如真与假,在布尔变量碰巧是不可变的),和名称。名字是你所说的变量,但名字属于一个范围,你不能改变通常比当地名称的其他名称。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top