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

作者: dogs1231992 (河豚)   2019-01-08 05:39:21
大家好,小弟最近遇到一個超出我先前對於程式語言理解的問題
我在使用分子模擬軟體 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. ]]
作者: Angesi (小雲豹)   2019-01-10 09:39:00
深深覺得你要學C 這觀念是C的pointer
作者: vfgce (小兵)   2019-01-09 18:28:00
學一下numpy吧, list用來操作二維以上陣列很不方便
作者: dogs1231992 (河豚)   2019-01-08 06:48:00
找到解答了,要用 deepcopyfrom copy import deepcopy
作者: anotherday   2019-01-08 10:34:00
也可以這麼做 test_b = test_a[:]喔 我錯了 你的list裡還有資料結構 用你的方法是對的
作者: germun (ger)   2019-01-08 10:59:00
因為python的等號不是複製 你個三個name都是同一個空間
作者: f496328mm (為什麼會流淚)   2019-01-08 20:32:00
你去看 C 就知道了他是存記憶體位址,省空間

Links booklink

Contact Us: admin [ a t ] ucptt.com