10

我发送了对 bool 对象的引用,并在方法中对其进行了修改。方法执行完毕后,方法外的布尔值没有改变。

这让我相信 Python 的布尔值是按值传递的。真的吗?还有哪些其他 Python 类型有这种行为?

4

4 回答 4

13

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

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

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

于 2009-09-29T20:23:48.177 回答
1

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

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

Python 按值传递对对象的引用(如 Java),Python 中的一切都是对象。这听起来很简单,但随后您会注意到某些数据类型似乎表现出按值传递的特征,而另一些数据类型似乎表现得像按引用传递......这是怎么回事?

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

于 2009-09-29T20:22:06.887 回答
1

要记住的是,在 Python 中,函数或方法无法在调用命名空间中重新绑定名称当您编写“我发送了对 bool 对象的引用,并在方法中对其进行了修改”时,您实际上所做的(我猜)是在内部重新绑定参数名称(bool 值被调用绑定到该名称)方法体。

于 2009-09-30T02:51:58.350 回答
0

简而言之,Python 中没有变量;有对象(如 True 和 False,布尔值恰好是不可变的)和名称。名称就是你所说的变量,但是名称属于一个范围,除了本地名称之外,你通常不能更改名称。

于 2009-09-29T20:24:08.323 回答