问题描述
我们可以通过将修改后的变量的新存储位置与最初定义的变量进行比较来检查对象类型是否可变。
例如- int()是Python中的不可变对象。如果我尝试修改整数类型变量的值,则会发现内存位置发生了变化 [下面的代码和输出] 。有人可以在后台提供简短的解释吗?
#initial variable
a = 10
# initial memory location
print(id(a))
#modified variable
a += 1
# new memory location,is it same?
print(id(a))
OUTPUT 93285870446416 93285870446524
解决方法
后台发生了什么事?
a = 10
- 解释器看到一个表达式并确定结果的类型,即
int
-
int
的内存已保留,给出了一个内存地址,将该内存标记为“正在使用” - 运算结果存储在该内存地址中
- -/-(尚不适用)
a += 1
- 解释器看到一个表达式并确定结果的类型,即
int
- 保留
int
的内存,并提供一个新的内存地址,因为旧的仍在使用中 - 运算结果存储在该新的内存地址中
- 不再有变数指向旧地址,因此将其标记为免费
也许是另一个
a += 1
- 解释器看到一个表达式并确定结果的类型,即
int
-
int
的内存已保留,可以提供另一个新的内存地址,或重新使用现在释放的内存地址(“旧”地址) - 运算结果存储在该新的内存地址中
- 地址不再存在变数,因此将其标记为空闲
以此类推
,请注意,与C语言和静态类型语言相反,Python仅在运行时进行类型检查。
在C语言中,您会这样做:
int a; /* creating a memory space allowing only holding data of integer type */
a = 3; /* storing the value 3,not a character,but an integer,otherwise error is returned at compilation */
在Python中,a = 3首先在某个内存空间中创建对象3 ,然后在分配过程中将名称 a 链接到该对象位置。然后通过指向其分配的内存绑定该对象。
CPython已经为-5到256范围内的整数分配了一个内存空间。如果立即编写 b = 3 , b 将与共享相同的内存位置> b 只是指向同一对象 3 的另一个指针。
整数是不可变的,如果您执行+ = 1,则会在不同的内存地址创建一个新对象4,然后 a 会指向该新位置。 b 保持绑定到对象3。
请注意,如果对象不再链接到任何名称( a , b 等),则可以对其进行垃圾回收。计数器 sys.getrefcount(X)用于跟踪对给定对象“ X”的所有引用。