Re: [閒聊] python大師請進

作者: surimodo (好吃棉花糖)   2022-06-29 00:21:21
找半天也看不出哪裡錯
結果是傳值為啥變成傳址= =
原來python有這麼騷的操作
A = json.load(f)
B = A
本來一個要當參考值讀取就沒要變
一個要把變動重新寫入檔案
結果 我動A
B也跟著一起動了
wtf
分開讀取不用 B =A
問題都解決了
作者: JerryChungYC (JerryChung)   2022-06-29 00:28:00
所以是有兩個檔案ㄛ
作者: surimodo (好吃棉花糖)   2022-06-29 00:29:00
一個檔案但要用兩次所以先讀一次放到A B再讀取A結果更動A B也會更多
作者: JerryChungYC (JerryChung)   2022-06-29 00:33:00
B = new, if B != A: B = A 呢A = B
作者: surimodo (好吃棉花糖)   2022-06-29 00:35:00
沒試 我直接也讀取 B=json.load(f)
作者: Suicidism () )   2022-06-29 00:38:00
做什摸會需要邊讀取邊修改
作者: JerryChungYC (JerryChung)   2022-06-29 00:38:00
怎麼不直接比對你對A動的值與原本的值是否不同
作者: surimodo (好吃棉花糖)   2022-06-29 00:39:00
我是程式開頭直接讀取 不用比較阿一定兩個都相同是一個讀取後不更動 一個要更動只是更動的那個變數 很神奇也會影響另一個
作者: int0x80 (請逐項修改)   2022-06-29 00:42:00
python哪有什麼址 那叫reference
作者: Suicidism () )   2022-06-29 00:43:00
json.loads回傳的是一個dictionary所以A跟B都會參照同一個物dictionary 物件
作者: int0x80 (請逐項修改)   2022-06-29 00:44:00
dict是mutable A和B指向同一個dict 當然會一起被改道
作者: surimodo (好吃棉花糖)   2022-06-29 00:44:00
我B=A 不是應該複製一份物件給B ?喔 那就是傳址阿乾
作者: int0x80 (請逐項修改)   2022-06-29 00:46:00
例如先A=1 再A=A+1 實際上是把A從指向1變成指向2沒有地址阿 哪來的地址 python不須要地址來定義全部都是reference
作者: Suicidism () )   2022-06-29 00:49:00
作者: surimodo (好吃棉花糖)   2022-06-29 00:51:00
pass by reference中文就是傳址= =
作者: JerryChungYC (JerryChung)   2022-06-29 00:51:00
所以 變動重新寫入檔案 然後變動是跟原本的一樣 ㄇ
作者: Mesenne (心火)   2022-06-29 01:01:00
dict要用dict.copy()複製ㄚ 如果是巢狀要用copy包裡面的一個func才能複製
作者: yoshin1007 (yoshin1007)   2022-06-29 01:08:00
可以把python的變數名稱想像成貼紙A = json.load(f) 做了兩件事:1. 建構一個dict 2.在這個dict上貼上A這個貼紙B = A 又做了兩件事:1. 找到A貼紙黏的物件 2. 在這個物件上貼上另一個貼紙B你會發現這個物件上同時貼了A跟B兩張貼紙,所以A跟B參照同一個物件

Links booklink

Contact Us: admin [ a t ] ucptt.com