我发送了一个bool对象的引用,并在一个方法中修改了它。方法完成后执行,方法外的bool值保持不变。
这让我相信Python的bool是通过值传递的。真的吗?其他Python类型的行为方式是什么?
答案 0 :(得分:13)
Python变量不是C ++意义上的“引用”。相反,它们只是绑定到内存中某个任意位置的对象的本地名称。如果该对象本身是可变的,则对其绑定名称的其他范围内的对其的更改将是可见的。然而,许多原始类型(包括bool
,int
,str
和tuple
)都是不可变的。你不能就地改变它们的价值;相反,您在本地范围内为同一名称指定一个新值。
事实上,几乎在任何时候*您都会看到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恰好是不可变的)和名字。名称是您调用变量的名称,但名称属于范围,您通常不能更改本地名称以外的名称。