Re: [閒聊] python大師請進

看板Marginalman作者 (搖滾少女!! 活力棉花糖!!)時間2年前 (2022/06/29 00:21), 編輯推噓7(7027)
留言34則, 6人參與, 2年前最新討論串23/74 (看更多)
找半天也看不出哪裡錯 結果是傳值為啥變成傳址= = 原來python有這麼騷的操作 A = json.load(f) B = A 本來一個要當參考值讀取就沒要變 一個要把變動重新寫入檔案 結果 我動A B也跟著一起動了 wtf 分開讀取不用 B =A 問題都解決了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.82.155.109 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1656433283.A.741.html

06/29 00:28, 2年前 , 1F
所以是有兩個檔案ㄛ
06/29 00:28, 1F

06/29 00:29, 2年前 , 2F
一個檔案但要用兩次
06/29 00:29, 2F

06/29 00:30, 2年前 , 3F
所以先讀一次放到A B再讀取A
06/29 00:30, 3F

06/29 00:30, 2年前 , 4F
結果更動A B也會更多
06/29 00:30, 4F

06/29 00:33, 2年前 , 5F
B = new, if B != A: B = A 呢
06/29 00:33, 5F

06/29 00:33, 2年前 , 6F
A = B
06/29 00:33, 6F

06/29 00:35, 2年前 , 7F
沒試 我直接也讀取 B=json.load(f)
06/29 00:35, 7F

06/29 00:38, 2年前 , 8F
做什摸會需要邊讀取邊修改
06/29 00:38, 8F

06/29 00:38, 2年前 , 9F
怎麼不直接比對你對A動的值與原本的值是否不同
06/29 00:38, 9F

06/29 00:39, 2年前 , 10F
我是程式開頭直接讀取 不用比較阿一定兩個都相同
06/29 00:39, 10F

06/29 00:40, 2年前 , 11F
是一個讀取後不更動 一個要更動
06/29 00:40, 11F

06/29 00:40, 2年前 , 12F
只是更動的那個變數 很神奇也會影響另一個
06/29 00:40, 12F

06/29 00:42, 2年前 , 13F
python哪有什麼址 那叫reference
06/29 00:42, 13F

06/29 00:43, 2年前 , 14F
json.loads回傳的是一個dictionary
06/29 00:43, 14F

06/29 00:43, 2年前 , 15F
所以A跟B都會參照同一個物dictionary 物件
06/29 00:43, 15F

06/29 00:44, 2年前 , 16F
dict是mutable A和B指向同一個dict 當然會一起被改道
06/29 00:44, 16F

06/29 00:44, 2年前 , 17F
我B=A 不是應該複製一份物件給B ?
06/29 00:44, 17F

06/29 00:45, 2年前 , 18F
喔 那就是傳址阿乾
06/29 00:45, 18F

06/29 00:46, 2年前 , 19F
例如先A=1 再A=A+1 實際上是把A從指向1變成指向2
06/29 00:46, 19F

06/29 00:49, 2年前 , 20F
沒有地址阿 哪來的地址 python不須要地址來定義
06/29 00:49, 20F

06/29 00:49, 2年前 , 21F
全部都是reference
06/29 00:49, 21F

06/29 00:49, 2年前 , 22F

06/29 00:50, 2年前 , 23F
這篇不錯
06/29 00:50, 23F

06/29 00:51, 2年前 , 24F
pass by reference中文就是傳址= =
06/29 00:51, 24F

06/29 00:51, 2年前 , 25F
所以 變動重新寫入檔案 然後變動是跟原本的一樣 ㄇ
06/29 00:51, 25F

06/29 01:01, 2年前 , 26F
dict要用dict.copy()複製ㄚ 如果是巢狀要用copy包裡面的
06/29 01:01, 26F

06/29 01:01, 2年前 , 27F
一個func才能複製
06/29 01:01, 27F

06/29 01:08, 2年前 , 28F
可以把python的變數名稱想像成貼紙
06/29 01:08, 28F

06/29 01:08, 2年前 , 29F
A = json.load(f) 做了兩件事:1. 建構一個dict 2.
06/29 01:08, 29F

06/29 01:08, 2年前 , 30F
在這個dict上貼上A這個貼紙
06/29 01:08, 30F

06/29 01:08, 2年前 , 31F
B = A 又做了兩件事:1. 找到A貼紙黏的物件 2. 在這
06/29 01:08, 31F

06/29 01:08, 2年前 , 32F
個物件上貼上另一個貼紙B
06/29 01:08, 32F

06/29 01:08, 2年前 , 33F
你會發現這個物件上同時貼了A跟B兩張貼紙,所以A跟B
06/29 01:08, 33F

06/29 01:08, 2年前 , 34F
參照同一個物件
06/29 01:08, 34F
文章代碼(AID): #1Ykog3T1 (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1Ykog3T1 (Marginalman)