[問題] Python 使用其它矩陣時會更改原始矩陣?

看板Python作者 (河豚)時間5年前 (2019/01/08 05:39), 5年前編輯推噓3(306)
留言9則, 6人參與, 5年前最新討論串1/1
大家好,小弟最近遇到一個超出我先前對於程式語言理解的問題 我在使用分子模擬軟體 ase 時,設定Total_images為我的資料 然後用變數 test_a 跟 test_b 來複製Total_images test_a = Total_images test_b = Total_images 接著我希望更改 test_b 裡面的部分資料 arr = [] for i in range(0,len(test_b)): for j in range(0,len(test_b[i])): arr = arr+[(j,j,j)] test_b[i].set_positions(arr) arr=[] 基本上就只有這幾行程式碼,我在for loop前後各自擺上一個 print Total_images[0].get_positions() 結果印出了不一樣的東西,也就是說原本的Total_images也被重設部分資料了 這個導致我後面的計算直接跳出錯誤 除了檢查 test_b 跟 Total_images以外,我還發現 test_a 也是整個被改變了 不知各位是否曾經遇過這種問題呢? 是不是我在哪邊設定錯了? 我的理解是,我把 Total_images 複製一份後放到 test_b 裡面 此時 test_b 不管怎麼弄,都不應該會影響到 Total_images 才對吧? 還希望前輩們多多指點,謝謝 :) 補充: 我剛才發現,資料錯了就算了,印出來的東西還有漏 依照上面的設定,數據應該會變成 0 0 0 到 65 65 65才對 [[ 0. 0. 0. ] [ 1. 1. 1. ] [ 2. 2. 2. ] [ 3. 3. 3. ] [ 4. 4. 4. ] [ 5. 5. 5. ] [ 6. 6. 6. ] [ 7. 7. 7. ] [ 0. 0. 25.82318415] [ 2.95358503 0. 25.82318415] [ 1.47679251 2.55787966 25.82318415] [ 4.43037754 2.55787966 25.82318415] [ 12. 12. 12. ] [ 13. 13. 13. ] [ 14. 14. 14. ] [ 15. 15. 15. ] [ 16. 16. 16. ] [ 17. 17. 17. ] [ 18. 18. 18. ] [ 19. 19. 19. ] [ 20. 20. 20. ] [ 21. 21. 21. ] [ 22. 22. 22. ] [ 23. 23. 23. ] [ 24. 24. 24. ] [ 25. 25. 25. ] [ 26. 26. 26. ] [ 27. 27. 27. ] [ 28. 28. 28. ] [ 29. 29. 29. ] [ 30. 30. 30. ] [ 31. 31. 31. ] [ 32. 32. 32. ] [ 33. 33. 33. ] [ 34. 34. 34. ] [ 35. 35. 35. ] [ 36. 36. 36. ] [ 37. 37. 37. ] [ 38. 38. 38. ] [ 39. 39. 39. ] [ 40. 40. 40. ] [ 41. 41. 41. ] [ 42. 42. 42. ] [ 43. 43. 43. ] [ 44. 44. 44. ] [ 45. 45. 45. ] [ 46. 46. 46. ] [ 47. 47. 47. ] [ 48. 48. 48. ] [ 49. 49. 49. ] [ 50. 50. 50. ] [ 51. 51. 51. ] [ 52. 52. 52. ] [ 53. 53. 53. ] [ 54. 54. 54. ] [ 55. 55. 55. ] [ 56. 56. 56. ] [ 57. 57. 57. ] [ 58. 58. 58. ] [ 59. 59. 59. ] [ 60. 60. 60. ] [ 61. 61. 61. ] [ 62. 62. 62. ] [ 63. 63. 63. ] [ 64. 64. 64. ] [ 65. 65. 65. ]] -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 128.173.27.227 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1546897163.A.746.html ※ 編輯: dogs1231992 (128.173.27.227), 01/08/2019 05:42:03

01/08 06:48, 5年前 , 1F
找到解答了,要用 deepcopy
01/08 06:48, 1F

01/08 06:48, 5年前 , 2F
from copy import deepcopy
01/08 06:48, 2F

01/08 10:34, 5年前 , 3F
也可以這麼做 test_b = test_a[:]
01/08 10:34, 3F

01/08 10:34, 5年前 , 4F
喔 我錯了 你的list裡還有資料結構 用你的方法是對的
01/08 10:34, 4F

01/08 10:59, 5年前 , 5F
因為python的等號不是複製 你個三個name都是同一個空間
01/08 10:59, 5F

01/08 20:32, 5年前 , 6F
你去看 C 就知道了
01/08 20:32, 6F

01/08 20:32, 5年前 , 7F
他是存記憶體位址,省空間
01/08 20:32, 7F

01/09 18:28, 5年前 , 8F
學一下numpy吧, list用來操作二維以上陣列很不方便
01/09 18:28, 8F

01/10 09:39, 5年前 , 9F
深深覺得你要學C 這觀念是C的pointer
01/10 09:39, 9F
文章代碼(AID): #1SCySBT6 (Python)