python copy เมื่อเขียนจริงเหรอ?

เมื่อกระบวนการแยกลูก ลูกจะไม่คัดลอกตัวแปรของพ่อ แต่ถ้ากระบวนการลูกเปลี่ยนค่าของตัวแปรของพ่อ มันจะสร้างตัวแปรใหม่ เราเรียกสำเนานี้ว่าการเขียน ตอนนี้โปรดดูโค้ดด้านล่าง:

# 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