python中的不可变对象是否意味着它的值在构思后无法更改? 如果是这种情况,当我们试图改变其价值时会发生什么。
让我试着通过一个例子来解释我的怀疑。
例如,我初始化了一个值为S
的String对象"Hello World"
。
S = 'Hello World'
然后我输入了一行,
S = 'Hello Human'
所以当我问翻译时,它告诉我S的值是"Hello Human"
。显然,现在'S'有了新的价值。
价值是如何变化的? python是否销毁了旧的字符串对象并使用新值创建了一个新的字符串对象?或者它只是改变了旧对象的值。这与字符串对象是不可变的这一事实有什么关系吗?如果是这样,那么可变对象如何表现?
答案 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版本...但我认为这是实现细节你不用担心。
可变对象(如字典/列表)可以通过各种方法(内部或外部)更改其内部状态,不可变对象没有这样的方法,它们的状态只能在构造期间设置,并且对象本身只能被销毁,除非它们是因性能原因汇集......