python中的不可变对象

Tan*_*Woo 1 python mutable immutability variable-assignment

我看到一篇关于不可变对象的文章.

它表示何时:
variable = immutable
将不可变赋值给变量.

例如
a = b # b is a immutable
它在这种情况下a指的是a copy of b,而不是reference to b.如果是mutable,那么a就是a reference to b

所以:

a = 10
b = a
a =20
print (b) #b still is 10
Run Code Online (Sandbox Code Playgroud)

但在这种情况下:

a = 10
b = 10
a is b # return True
print id(10)
print id(a)
print id(b) # id(a) == id(b) == id(10)
Run Code Online (Sandbox Code Playgroud)

if a是副本10,b也是副本10,为什么id(a) == id(b) == id(10)?

agf*_*agf 5

虽然那篇文章对于某些语言可能是正确的,但对于Python来说却是错误的.

在Python中进行任何正常分配时:

some_name = some_name_or_object
Run Code Online (Sandbox Code Playgroud)

你没有复制任何东西.您只是将名称指向作业右侧的对象.

可变性无关紧要.

更具体地说,原因是:

a = 10
b = 10
a is b
Run Code Online (Sandbox Code Playgroud)

True,这10是实习 - 意味着Python 10在内存中保留一个,以及设置为10指向同一个的任何东西10.

如果你这样做

a = object()
b = object()
a is b
Run Code Online (Sandbox Code Playgroud)

你会得到的False,但是

a = object()
b = a
a is b
Run Code Online (Sandbox Code Playgroud)

仍然会True.

  • Python尝试实习"int"值,但并不总是成功.尝试`a = 1000`和`b = 999`然后是'b + = 1`.当我刚才尝试时,`a`和`b`分别绑定到一个值为1000的不同`int`对象.我认为实际上,对于值0和1,实习将会成功. (2认同)

Ign*_*ams 5

“简单”的不可变文字(特别是 -1 到 255 之间的整数)是interned,这意味着即使绑定到不同的名称,它们仍然是同一个对象。

>>> a = 'foo'
>>> b = 'foo'
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)