如何通过修改python中的不可变对象来更改内存位置?
How does memory location changes by modifying an immutable object in python?
我们可以通过将修改变量的新内存位置与最初定义的变量进行比较来检查对象类型是否可变。
例如 - 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
的内存被保留,给出一个新的内存地址,因为旧的还在使用
- 操作的结果存储在那个新的内存地址
- 不再有指向旧地址的变量,因此标记为空闲
Maybe another
a += 1
- 解释器看到一个表达式,判断结果的类型,就是
int
int
的内存已保留,提供另一个新内存地址,或重新使用现在释放的内存地址(“旧”地址)
- 操作的结果存储在那个新的内存地址
- 没有指向该地址的变量,因此标记为空闲
等等
请注意,与 C 和 static-typing 语言相反,Python type-checks 仅在运行时。
在 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首先在某个内存space创建一个对象3,然后链接名字 a 到分配期间的那个对象位置。 a 然后通过指向其分配的内存 绑定 到该对象。
CPython 已经为 -5 到 256 范围内的整数分配了内存 space。如果你现在写 b = 3, b 将共享相同的内存位置,因为 b 只是指向同一对象的另一个指针 3.
整数是不可变的,如果你做 a += 1,那么一个新的对象 4 会在不同的内存地址创建,然后 a 将指向这个新位置。 b 保持绑定到对象 3.
请注意,如果对象不再链接到任何名称(a、b 等),则它可以是 garbage-collected。计数器 sys.getrefcount(X) 用于跟踪对给定对象“X”的所有引用。
我们可以通过将修改变量的新内存位置与最初定义的变量进行比较来检查对象类型是否可变。
例如 - 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
的内存被保留,给出一个新的内存地址,因为旧的还在使用 - 操作的结果存储在那个新的内存地址
- 不再有指向旧地址的变量,因此标记为空闲
Maybe another
a += 1
- 解释器看到一个表达式,判断结果的类型,就是
int
int
的内存已保留,提供另一个新内存地址,或重新使用现在释放的内存地址(“旧”地址)- 操作的结果存储在那个新的内存地址
- 没有指向该地址的变量,因此标记为空闲
等等
请注意,与 C 和 static-typing 语言相反,Python type-checks 仅在运行时。
在 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首先在某个内存space创建一个对象3,然后链接名字 a 到分配期间的那个对象位置。 a 然后通过指向其分配的内存 绑定 到该对象。
CPython 已经为 -5 到 256 范围内的整数分配了内存 space。如果你现在写 b = 3, b 将共享相同的内存位置,因为 b 只是指向同一对象的另一个指针 3.
整数是不可变的,如果你做 a += 1,那么一个新的对象 4 会在不同的内存地址创建,然后 a 将指向这个新位置。 b 保持绑定到对象 3.
请注意,如果对象不再链接到任何名称(a、b 等),则它可以是 garbage-collected。计数器 sys.getrefcount(X) 用于跟踪对给定对象“X”的所有引用。