這是妳提到的第壹種情況:
=====
類別數據:
def _ _ init _ _(self,data):
self.data =數據
然後分別執行以下代碼:
d 1 = data(“123“);d2 =數據(“345”)
D1.data返回“123”,d2.data返回“345”。
執行d2.data=d1.data後,D2 . data =“123“。
執行del(d 1 . data)後,d2.data將返回語法錯誤。
=====
這種情況不可能發生。測的時候是錯字嗎?經過我的測試,不會錯的。
& gt& gt& gtd1 =數據(“123“)
& gt& gt& gtd2 =數據(“345”)
& gt& gt& gtd1.data
'123'
& gt& gt& gtd2 .數據
'345'
& gt& gt& gtid(d 1 . data)
872552800
& gt& gt& gtid(D2 . data)
872552608
& gt& gt& gtd2.data = d1.data
& gt& gt& gtid(d 1 . data)
872552800
& gt& gt& gtid(d2 . data)#此時d1和D2的數據對象指向同壹事物。
872552800
& gt& gt& gtd2 .數據
'123'
& gt& gt& gtDel d1.data #刪除了d1類中的數據對象。
& gt& gt& gtid(D2 . data)# D2 . data仍然指向內存中“123”的地址。
872552800
& gt& gt& gtd2 .數據
'123'
Python有壹個返回對象id的ID方法。
& gt& gt& gtid(d 1 . data)
872552800
這對妳調試這個問題應該很有幫助。
此外,在python中,調用del方法只會刪除該對象對內存中數據的引用。我希望這個例子能徹底幫助妳:
& gt& gt& gta =“python“
& gt& gt& gt身份證(a)
871561600
& gt& gt& gt德爾a
& gt& gt& gta
回溯(最近壹次呼叫):
文件“<標準輸入》,第1行,in & lt模塊& gt
名稱錯誤:未定義名稱“a”
& gt& gt& gtb =“python“
& gt& gt& gt身份證(b)
871561600
我們可以看到,當我們調用del a方法時,我們只刪除了對“python”字符串的引用,而內存中“python”字符串的id保持不變。
python的副本僅使另壹個變量指向與前壹個變量相同的地址,例如:
& gt& gt& gtA =“test“#定義壹個值為“test“的變量A。
& gt& gt& gt#查看的Id。
872553312
& gt& gt& gtB = a #將A復制到b。
& gt& gt& gtb
測試
& gt& gt& gtid(b)# b和a實際上指向內存中的同壹地址。
872553312
可以推薦樓主再看壹下python的淺層拷貝和深層拷貝,可以多了解壹下python的存儲機制:
& gt& gt& gta =
& gt& gt& gtb = a
& gt& gt& gta【0】=“a”
& gt& gt& gta
【‘a‘,2,3】
& gt& gt& gtb
【‘a‘,2,3】
& gt& gt& gt導入副本
& gt& gt& gtc = copy . deepcopy(a)
& gt& gt& gta
【‘a‘,2,3】
& gt& gt& gtc
【‘a‘,2,3】
& gt& gt& gta【0】=“更改”
& gt& gt& gta
【‘改變‘,2,3】
& gt& gt& gtb
【‘改變‘,2,3】
& gt& gt& gtc
【‘a‘,2,3】