Python 的布尔值是按值传递的吗?

Posted

技术标签:

【中文标题】Python 的布尔值是按值传递的吗?【英文标题】:Are Python's bools passed by value? 【发布时间】:2010-12-02 10:55:57 【问题描述】:

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

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

【问题讨论】:

重复,请看***.com/questions/534375/passing-values-in-python 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

“Python 中没有变量”是迂腐和误导,我真希望人们不要再说了。【参考方案3】:

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

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

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

【讨论】:

是的,严格来说,Python 中的一切都是通过地址传递的。 Python 只有一个参数传递过程。只是有些对象是可变的,而另一些对象却没有,这会让人产生一种神奇的更复杂的事情正在发生的错觉。【参考方案4】:

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

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

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

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

【讨论】:

-1:首先,这似乎是对提到的重复问题的接受答案的副本(可能是巧合)。其次,你不能改变不可变的对象——这就是不可变的意思。说改变不可变对象会创建一个新实例只是混淆了这个问题。您可以重新绑定不可变对象的名称,但这不是一回事! 有趣,我什至没有看到副本。当我回答时,这个问题没有被标记为重复。谷歌搜索“Python pass by reference”给了我上面的链接。此外,巧合的是,您有问题的报价是副本接受的答案。我不觉得很难理解,如果 Python 可以就地编辑,它会,如果不能,它会制作本地副本。这是另一个引用上面链接但提供更多解释的站点:bogdan.org.ua/2008/02/11/…

以上是关于Python 的布尔值是按值传递的吗?的主要内容,如果未能解决你的问题,请参考以下文章

切片是按值传递的吗?

C++中的指针是按值传递的吗?

如果 VAR_INPUT 是 INTERFACE 类型,那么值是按引用传递还是按值传递?

JS基础类型和对象,分别是按值传递还是按引用传递?

java中的参数传递是按引用传递还是按值传递

JavaScript 是按引用传递还是按值传递? [复制]