2016-10-03 80 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 [:]' –

相关问题