2016-10-03 1 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は、このスクリプトのどの時点でも実行されていないはずです。私はnew_gpsと呼ばれるgps_markersのコピーを作る。私はnew_gpsから私のmake_pointsメソッドを実行します。それは前記変数に影響を与える。でもそれは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

2行目では '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] 

すべての場合には適用されません(あなたが深くネストされた構造を有していてもよいです)、

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

私はそれを得ることを意味しますが、私は 'new_gps'変数に関係なく出力が同じになるように自分の状況を並べ替えることができます。 – shmink

+0

@Shminkこのリンクは、さまざまなオプション[Pythonでリストを複製またはコピーする方法]を提供します(http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list- in-python) – roganjosh

+0

'[:]'は 'copy.deepcopy'として動作しませんでした。どんな考え? – shmink

1

あなたの問題は、あなたが実際にオブジェクトをコピーせずに、同じオブジェクトを参照する変数を設定していることである。したがって、標準ライブラリには、実際にそのためのcopy.deepcopy機能を持っています。その詳細については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 [:]'をスライスする –

関連する問題