2016-10-03 140 views
0

這是一個奇怪的。除非我在做一些愚蠢的事情。我有以下代碼:一個變量是另一個變量也在改變原來的

gps_markers = [ ['Example text', 34.4563,-118.1241], [34.5235,-118.1245], [34.6432,-118.1554] ] 
new_gps = gps_markers 

def make_points(coords): 
    if(coords): 
     # Firstly we don't want the hover text. 
     for x in range(0, len(coords)): 
      if(len(coords[x]) == 3): 
       coords[x].pop(0) 

     new_list = [{'lat': d[0], 'lng': d[1]} for d in coords] 
    # Return the new list after the list comprehension. 
    return new_list 

print '\nbefore newgps ->', gps_markers 

new_gps = make_points(new_gps) 

print '\nafter newgps ->', gps_markers 

然後運行腳本,我從打印行獲得以下輸出。

before newgps -> [['Example text', 34.4563, -118.1241], [34.5235, -118.1245], [34.6432, -118.1554]] 

after newgps -> [[34.4563, -118.1241], [34.5235, -118.1245], [34.6432, -118.1554]] 

現在爲什麼它對我沒有意義。第一個變量gps_markers不應該在這個腳本的任何位置生效,對吧?我製作gps_markers的副本new_gps。然後通過我的make_points方法運行new_gps。這將影響該變量。但它也影響gps_markers?不知道是否我只是一直盯着這個太長時間,或者是否有我失蹤的東西。感覺就像兩個一樣。

+0

參見[這裏](http://stackoverflow.com/questions/17707742/changing-a-value-in-one-list-changes-the-values-in-another-list-with-a-different ) – roganjosh

+0

在第二行中應該是'new_gps = gps_markers [:]'。這將創建第一個列表的副本。 – Nf4r

+1

'a = b'不會生成b的新副本。 a和b是SAME對象的不同名稱。 –

回答

4

Python的分配由參考,即new_gpsgps_markers實際上是相同的對象。

如果你需要保持原有的列表中,那麼你需要一個新的列表,並複製所有子列表:

new_gps = [sublist[:] for sublist in gps_markers] 

這並不適用於所有情況下(你可能有一個深度嵌套結構)因此,標準庫實際上已經爲copy.deepcopy功能:

import copy 
new_gps = copy.deepcopy(gps_markers) 
+0

我的意思是我知道它,但我怎麼能排序我的情況,使輸出保持不變,而不管我做'new_gps'變量。 – shmink

+0

@閃爍此鏈接將給你不同的選項[如何在Python中克隆或複製列表?](http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list- in-python) – roganjosh

+0

'':''不能在'copy.deepcopy'中工作。任何想法爲什麼? – shmink

1

你的問題是,你要設置的變量引用同一個對象,而無需實際複製的對象。您可以閱讀關於here的更多信息。

爲了使列表的副本,你可以做

new_gps = list(gps_markers) 

new_gps = gps_markers[:] 

import copy 
new_gps = copy.copy(gps_markers) 

,或者gps_markers包含對象或內部列表(它確實在這種情況下):

import copy 
new_gps = copy.deepcopy(gps_markers) 
+1

或切片'gps_markers [:]' –

相關問題