2016-03-22 12 views
-4

リストのシャローコピーを作成しようとしていますが、このリストはオブジェクトの属性に格納されています。私の浅いコピーはそれdoesntの仕事関数であるにもかかわらず、私はここでリストの浅いコピーを作成するPythonは、オブジェクト属性では機能しませんか?

copy.copy 

temp = list(actuallist) 

temp = actuallist[:] 

これは一部ところである。これは、オブジェクト

class Game: 

    tiles = [] 
    daleks = [] 
    rawtile = "" 
    height = 20 
    width = 20 
    tilesize = 32 
    gamemap = "default" 
    status = 0 
    doctor = "" 
    screen = "" 
    clock = pygame.time.Clock() 

    def __init__(self,height,width,tilesize,gamemap): 
     self.height = height 
     self.width = width 
     self.tilesize = 32 
     self.gamemap = gamemap 
     self.status = 0 
     size = (tilesize*width, tilesize*height) 
     self.screen = pygame.display.set_mode(size) 
     pygame.display.set_caption("Doctor Who vs Daleks") 

    def teleportDoctorIn(self,classname): 
     self.doctor = classname 

    def releaseDalek(self,x): 
     self.daleks.append(x) 

    def resetDaleks(self): 
     daleks = [] 

である私の現在のコード

の一部を関連されてみました私は、Li)、浅いリストを作成し、

def updateMap(x,y): 
    temp = game.tiles[:] 
    """SET DOCTOR COORDS""" 
    temp[game.doctor.xpos][game.doctor.ypos] = "X" 
    game.doctor.move(x,y) 
    temp[game.doctor.xpos][game.doctor.ypos] = "D" 
    """LETS MOVE DALEKS""" 

iは(copy.deepcopyするために必要なが判明し、それを変更しますst。

+2

を何が起こるかを見ることができます*それは*仕事をdoesntの上手の込んだしてください。どのように動作しませんか?間違いましたか?予想外の結果ですか?何もない? – Reti43

+1

問題の性質を示すために必要でないすべてのコードをコードから削除してください。質問のタイトルはとてもシンプルですが、質問はなぜそんなに長いのですか? [最小限の例](http://stackoverflow.com/help/mcve)の作成方法をお読みください。 – timgeb

+0

'temp [game.doctor.xpos] [game.doctor.ypos] =" X "' - 浅いコピーはあなたに新しいリストを与えましたが、メンバー自身をコピーしませんでした。 'temp [game.doctor.xpos]'のオブジェクトは、 'game.tiles [game.doctor.xpos]'と同じオブジェクトです。あなたの意図が何であるか分かりませんが、おそらく 'copy.deepcopy'があなたが望むものです。 – tdelaney

答えて

0

この3つの方法では、リストの浅いコピーが作成されます。したがって、リスト自体は不透明ですが、他の要素に影響を与えずに要素を追加したり削除したりすることができます。含まれるオブジェクトは同じです。 temp[game.doctor.xpos][game.doctor.ypos] = "X"は、両方のリストによってまだ保持されている包含​​オブジェクトを変更します。一例として、

、単にリストにいくつかdict Sを入れて、

>>> import copy 
>>> d1={1:'one', 2:'two'} 
>>> d2={3:'three', 4:'four'} 
# create a list then copy it 
>>> l1=[d1, d2] 
>>> l2=l1[:] 

# l1 and l2 are different, but their members are the same 
>>> id(l1) == id(l2) 
False 
>>> id(l1[0]) == id(l2[0]) 
True 

# and if you change the objects in l2, they change l1 
>>> l1[0] 
{1: 'one', 2: 'two'} 
>>> l2[0][5]='five' 
>>> l1[0] 
{1: 'one', 2: 'two', 5: 'five'} 

# but a deep copy copies the contained objects also so no problem 
>>> l3=copy.deepcopy(l1) 

# the contained objects are not the same 
>>> id(l1[0]) == id(l3[0]) 
False 

# and changing one does not affect the other 
>>> l1[0] 
{1: 'one', 2: 'two', 5: 'five'} 
>>> l3[0] 
{1: 'one', 2: 'two', 5: 'five'} 
>>> l3[0][6] = 'six' 
>>> 
>>> l1[0] 
{1: 'one', 2: 'two', 5: 'five'} 
>>> l3[0] 
{1: 'one', 2: 'two', 5: 'five', 6: 'six'} 
>>> 
+0

20x20のタイルリストを深くコピーするとコードにどのくらいの影響がありますか?私はシンプルなゲームを作っています。キャラクターが一歩ずつ動いていきます。すべてのステップで、この深いコピーを作る必要があります。 –

+0

'timeit'モジュールを使って実験をすることができますが、20x20私はそれについて心配しないでしょう。特に、各ステップがユーザの介入を受けている場合、「入力」キーを押すのに要する時間が比較的長いところで比較すると、 – tdelaney

+0

私のコードでは、矢印キーで移動するたびにKeyUpをクリックすると、キャラクタの位置が1平方上に移動し、マップ内の「敵」がメインキャラクタに向かって1ブロック移動し、すべてのAIと計算が私はpygameモジュールを使ってタイルなどを視覚化しています。私はかなり新しいプログラミングです。これはPythonの最初のクラスですが、私は挑戦したいと思います。 –

関連する問題