写的python副本,真的吗?

时间:2017-09-22 01:43:18

标签: python fork copy-on-write

当一个进程fork一个子进程时,子进程不会复制父变量 但如果子进程更改了父变量的值,它将创建一个新变量,我们在写这个副本时调用,现在请在下面看到代码:

# 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]?

1 个答案:

答案 0 :(得分:1)

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

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