Python如何保证内存安全?

Ale*_*eft 1 python memory memory-management heap-memory rust

我正在学习 Rust,他们认为以下(相当于 python 的)代码是不安全的:

vec = ['1', '2']
ref = vec[0]
vec.append('3')
Run Code Online (Sandbox Code Playgroud)

基本原理是ref指向 中元素的指针vec,但是,vec正在通过 Push 命令在同一范围内发生变化,这可能涉及将对象移动到内存中有足够空间的全新位置,导致成为ref悬空指针 =>因此,编译器会因代码不安全而失败。

我对这个逻辑深信不疑,但到底为什么这在 Python 中从来都不是问题呢?我们vec在堆中仍然有 和ref是一个指针,对吗?

use*_*ica 6

ref不是指向 的一部分的指针vec。它存储对字符串对象的引用。by 引用的列表对象vec还存储对该字符串对象的引用。如果列表需要调整其底层存储的大小,它会将其保存的引用复制到新的缓冲区中,但字符串不会移动,因此ref此操作不会使 的引用无效。

  • @AlexDeft:Python 中的字符串是不可变的。即使对于可变对象,调整大小也不会使引用无效。(在实现级别,这是通过具有不移动的固定大小的“标头”来实现的,它存储指向可以安全地重新分配的缓冲区的指针。) (3认同)