Python的bool是否超值?

时间:2009-09-29 20:17:20

标签: python boolean pass-by-value

我发送了一个bool对象的引用,并在一个方法中修改了它。方法完成后执行,方法外的bool值保持不变。

这让我相信Python的bool是通过值传递的。真的吗?其他Python类型的行为方式是什么?

4 个答案:

答案 0 :(得分:13)

Python变量不是C ++意义上的“引用”。相反,它们只是绑定到内存中某个任意位置的对象的本地名称。如果该对象本身是可变的,则对其绑定名称的其他范围内的对其的更改将是可见的。然而,许多原始类型(包括boolintstrtuple)都是不可变的。你不能就地改变它们的价值;相反,您在本地范围内为同一名称指定一个新值。

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

* - Python中唯一的例外是属性的setter方法,可以让你编写obj.foo = X并在后台重写它,而不是调用像obj.setFoo(X)这样的方法。

答案 1 :(得分:1)

取决于对象是可变的还是不可变的。不可变对象的行为就像你用bool看到的那样,而可变对象会改变。

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

  

Python按值传递对象的引用(如Java),Python中的所有内容都是对象。这听起来很简单,但是你会注意到一些数据类型似乎表现出按值传递的特征,而其他数据似乎就像传递引用一样......这是什么交易?

     

理解可变和不可变对象很重要。某些对象(如字符串,元组和数字)是不可变的。在函数/方法中更改它们将创建一个新实例,并且不会更改函数/方法之外的原始实例。其他对象(如列表和词典)是可变的,这意味着您可以就地更改对象。因此,更改函数/方法内的对象也会更改外部的原始对象。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

简而言之, Python中没有变量;有对象(像真和假,bool恰好是不可变的)和名字。名称是您调用变量的名称,但名称属于范围,您通常不能更改本地名称以外的名称。

相关问题