5

python中的不可变对象是否意味着它的值在它的概念之后不能改变?如果是这种情况,当我们尝试改变它的值时会发生什么。

让我试着用一个例子来解释我的疑问。

例如,我S用 value初始化了一个 String 对象"Hello World"

S = 'Hello World'

然后我在行中输入,

S = 'Hello Human'

所以当我问解释器时,它告诉我 S 的值是"Hello Human"。显然,现在“S”有了新的价值。

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

4

6 回答 6

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
>>> 
于 2012-06-10T06:58:49.680 回答
4

值没有改变。该名称绑定到一个新对象。

于 2012-06-10T06:57:56.253 回答
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 会为您处理垃圾收集)。

于 2012-06-10T07:01:19.947 回答
2
s = 'helloworld'
>>> id(s)
29779592
>>> s = 'hello'
>>> id(s)
29771680

现在变量 S 引用新对象

于 2012-06-10T06:59:02.100 回答
1

python中的不可变对象是否意味着它的值在它的概念之后不能改变?

是的。

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

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

您真正要问的是,当我们分配给一个名为 value 的变量时会发生什么。

我希望您特别注意那里的“a”一词:多个变量可以命名相同的值。我还希望您特别注意“名称”这个词:Python 变量确实是名称——它们不存储值,而是为它们提供名称。

显然,现在“S”有了新的价值。

现在S 命名一个不同的值。

价值如何变化?

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

python是否破坏了旧的字符串对象

如果没有其他名称,它可能有。如果一个值没有名字,它最终会被销毁。作为程序员,这不是您关心的问题。

并创造了一个具有新价值的新产品?

是的。

如果是这样,那么可变对象的行为如何?

The same way, when you assign to the name. Names are names, and values are values. (In this context, "object" and "value" mean the same thing.) Assignment is the process of causing a name to name a value. It doesn't matter if the object is mutable or not. Mutation is done in other ways. (Although you could make an argument that, for example, a list is really a list of names, and you don't really mutate the list, but instead change the quantity of names and their referents.)

于 2012-06-10T10:57:20.737 回答
0

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

字典/列表等可变对象可以通过各种方法改变其内部状态,无论是内部还是外部,不可变对象没有这样的方法,它们的状态只能在构造过程中设置,对象本身只能被销毁,除非它们被池化以提高性能原因...

于 2012-06-10T08:29:01.940 回答