копия python при записи, правда?

когда процесс разветвляет дочерний процесс, дочерний процесс не будет копировать переменную отца, но если дочерний процесс изменит значение переменной отца, он создаст новую переменную, мы вызываем эту копию при записи, теперь см. код ниже:

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


person kwsy    schedule 22.09.2017    source источник
comment
en.wikipedia.org/wiki/Virtual_memory   -  person user2357112 supports Monica    schedule 22.09.2017
comment
Виртуальная память объясняет один и тот же адрес для обоих процессов, но все же почему адрес не изменился после назначения?   -  person geckos    schedule 22.09.2017


Ответы (1)


Это разные процессы. Поскольку каждая современная система теперь использует виртуальную память, адрес, который вы видите в приложении, на самом деле не соответствует тому, где физически хранится информация. Один и тот же адрес может быть для разных приложений: где-то в куче, сопоставлен с файлом на диске, сопоставлен с устройством отображения, не существует или что-то совершенно другое.

Когда процесс разветвляется, он сохранит логическую карту памяти родителя, иначе все указатели нужно будет обновить. Но карта будет указывать на совершенно другую область физической памяти после внесения изменений.

person viraptor    schedule 22.09.2017