python写时拷贝,真的吗?

python写时拷贝,真的吗?,python,fork,copy-on-write,Python,Fork,Copy On Write,当进程派生子进程时,子进程不会复制父变量 但如果子进程更改父变量的值,它将创建一个新变量,我们称之为写入时的副本,现在请参见下面的代码: # coding=utf-8 import os value = [] res = os.fork() if res == 0: value = [324] print 'child id={id} value={value}'.format(id=id(value), value=value) else: value = [2]

当进程派生子进程时,子进程不会复制父变量 但如果子进程更改父变量的值,它将创建一个新变量,我们称之为写入时的副本,现在请参见下面的代码:

# coding=utf-8
import os
value = []
res = os.fork()

if res == 0:
    value = [324]
    print 'child  id={id} value={value}'.format(id=id(value), value=value)
else:
    value = [2]
    print 'parent  id={id} value={value}'.format(id=id(value), value=value)
如果运行它,结果可能如下所示:

parent  id=4321407056 value=[2]
child  id=4321407056 value=[324]
我的问题是:

(1) 变量值的内存地址相同,为4321407056。 但是我已经改变了这个值,这意味着我将新的值写入变量,为什么不改变内存地址呢


(2) 如果它们有相同的内存地址,为什么它们有不同的值,一个是[2],另一个是[234]?

它们是不同的进程。由于现在每个现代系统都使用虚拟内存,因此您在应用程序中看到的地址实际上并不对应于信息的物理存储位置。相同的地址可以用于不同的应用程序:堆中的某个地方,映射到磁盘文件,映射到显示设备,不存在或完全不同的东西


当进程分叉时,它将保留父进程的逻辑内存映射,否则所有指针都需要更新。但在进行更改后,映射将指向完全不同的物理内存区域。

虚拟内存为两个进程解释了相同的地址,但仍然解释了地址在assignmet之后没有更改的原因?