【发布时间】:2010-12-02 10:55:57
【问题描述】:
我发送了一个对 bool 对象的引用,并在一个方法中对其进行了修改。方法执行完毕后,方法外的bool值没有变化。
这让我相信 Python 的布尔值是按值传递的。真的吗?还有哪些其他 Python 类型有这种行为?
【问题讨论】:
标签: python boolean pass-by-value
我发送了一个对 bool 对象的引用,并在一个方法中对其进行了修改。方法执行完毕后,方法外的bool值没有变化。
这让我相信 Python 的布尔值是按值传递的。真的吗?还有哪些其他 Python 类型有这种行为?
【问题讨论】:
标签: python boolean pass-by-value
要记住的是,在 Python 中没有方法可以让函数或方法在调用命名空间中重新绑定名称。当您编写“我发送了对 bool 对象的引用,并在方法中对其进行了修改”时,您实际上所做的(我猜)是在内部重新绑定参数名称(bool 值被调用绑定到该名称)方法体。
【讨论】:
简而言之,Python 中没有变量;有对象(如 True 和 False,布尔值恰好是不可变的)和名称。名称就是你所说的变量,但是名称属于一个作用域,除了本地名称之外,你通常不能更改名称。
【讨论】:
Python 变量不是 C++ 意义上的“引用”。相反,它们只是绑定到内存中某个任意位置的对象的本地名称。如果该对象本身是可变的,则对它的更改将在已将名称绑定到该对象的其他范围内可见。然而,许多原始类型(包括bool、int、str 和tuple)是不可变的。你不能就地改变它们的价值;相反,您为本地范围内的相同名称分配一个新值。
事实上,几乎任何时候*您都会看到foo = X 形式的代码,这意味着名称foo 在您当前的本地命名空间中被分配了一个新值(X),而不是在由foo 命名的内存正在更新其内部指针以引用X 的位置。
*- 在 Python 中唯一的例外是属性的 setter 方法,它可能允许您编写 obj.foo = X 并在后台重写它以调用类似 obj.setFoo(X) 的方法。
【讨论】:
这取决于对象是可变的还是不可变的。不可变对象的行为就像您在 bool 中看到的那样,而可变对象会改变。
供参考:http://www.testingreflections.com/node/view/5126
Python 按值传递对对象的引用(如 Java),Python 中的一切都是对象。这听起来很简单,但是您会注意到一些数据类型似乎表现出按值传递的特征,而另一些数据类型似乎表现得像按引用传递......这是怎么回事?
了解可变和不可变对象很重要。一些对象,如字符串、元组和数字,是不可变的。在函数/方法内更改它们将创建一个新实例,而函数/方法外的原始实例不会更改。其他对象,如列表和字典是可变的,这意味着您可以就地更改对象。因此,改变函数/方法内部的对象也会改变外部的原始对象。
【讨论】: