当python值改变时,python中的不可变对象会发生什么?

时间:2012-06-10 06:52:23

标签: python object immutability

python中的不可变对象是否意味着它的值在构思后无法更改? 如果是这种情况,当我们试图改变其价值时会发生什么。

让我试着通过一个例子来解释我的怀疑。

例如,我初始化了一个值为S的String对象"Hello World"

S = 'Hello World'

然后我输入了一行,

S = 'Hello Human'

所以当我问翻译时,它告诉我S的值是"Hello Human"。显然,现在'S'有了新的价值。

价值是如何变化的? python是否销毁了旧的字符串对象并使用新值创建了一个新的字符串对象?或者它只是改变了旧对象的值。这与字符串对象是不可变的这一事实有什么关系吗?如果是这样,那么可变对象如何表现?

6 个答案:

答案 0 :(得分:8)

Python停止S指向旧的字符串对象并使其指向新的

>>> S="Hello World"
>>> id(S)
32386960
>>> S="Hello Human"
>>> id(S)
32387008
>>> 

你不能改变不可变对象,所以即使你认为你很可能(例如使用+=运算符)你也不是

>>> S="Hello"
>>> id(S)
32386912
>>> S+=" World"
>>> id(S)
32386960
>>> 

答案 1 :(得分:4)

价值没有改变。 名称 绑定到新对象。

答案 2 :(得分:4)

所以,如果你正在做这样的事情:

>>> s = "Hello World"
>>> print s
"Hello World"
>>> old_s = s
>>> s = "Hello Human"
>>> print s
"Hello Human"
>>> print old_s
"Hello World"

你可以看到Python中的字符串不可变(字面意思 - 你不能改变它们)。

当您添加到字符串(或其他不可变对象,如元组或整数)时,将创建该对象的新副本,并删除旧的引用。 (当没有任何东西引用对象时,Python会为你处理垃圾收集。)

答案 3 :(得分:2)

s = 'helloworld'
>>> id(s)
29779592
>>> s = 'hello'
>>> id(s)
29771680

现在变量S引用新对象

答案 4 :(得分:1)

  

python中的一个不可变对象是否意味着它的值在构思之后无法更改?

  

如果是这种情况,当我们尝试更改其值时会发生什么。

这个问题无效,因为你从不试图改变它的价值,因为没有办法可以改变尝试。

您真正要问的是当我们分配给名称值的变量时会发生什么。

我希望你特别注意那里的“a”这个词:不止一个变量可以命名相同的值。我还想要你特别注意“名字”这个词:Python变量确实是名字 - 它们不存储值,但为它们提供名称。

  

显然现在'S'有一个新值。

现在S 名称是一个不同的值。

  

价值是如何变化的?

没有。 S停止命名它曾经命名的内容,并开始命名一个新值。

  

python是否销毁了旧的字符串对象

可能如果,则没有其他名称。如果没有值的名称,它将被销毁最终。这不是你作为程序员的关注。

  

并使用新值创建了一个新的?

  

如果是这样,那么可变对象如何表现?

同样,当您指定名称时。名称是名称,值是值。 (在此上下文中,“object”和“value”表示相同的内容。)赋值是使名称命名值的过程。对象是否可变是无关紧要的。突变以其他方式完成。 (虽然你可以提出一个论据,例如,list实际上是一个名单列表,你并没有真正改变列表,而是改变了名称及其所指对象的数量。)

答案 5 :(得分:0)

python中的变量只不过是绑定,所以当你使用赋值运算符时,你要么创建一个新的绑定,要么替换一个先前的取决于你可能正在使用的python版本...但我认为这是实现细节你不用担心。

可变对象(如字典/列表)可以通过各种方法(内部或外部)更改其内部状态,不可变对象没有这样的方法,它们的状态只能在构造期间设置,并且对象本身只能被销毁,除非它们是因性能原因汇集......