更改了对象中列表中的所有对象值,而不是仅更改了一个

时间:2014-06-03 17:07:20

标签: python list oop

我的程序有问题。当我尝试更改对象值(在列表中)时,我更改了该列表中的所有对象值 我的代码:

class obj:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def mirrorise(self, mirror):
        self.mirror = mirror
        if self.mirror.type == 'teleporterx':
            self.x -= (self.x-(self.mirror.x+self.mirror.x1/2))*2

class person(obj):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.pos = [obj(self.x, self.y)]
    def mirrored(self, mirrors):
        self.count = 0
        self.mirrors = mirrors
        self.mens = 0
        for men in self.pos:
            self.mens += 1
        for mirror in self.mirrors:
            if self.count == 1:
                for men in range(self.mens):
                    self.pos.append(self.pos[men])
            self.count = 1
        self.count = 0
        for men in self.pos:
            men.mirrorise(self.mirrors[self.count])
            self.count += 1
            if self.mirrors[self.count-1] == self.mirrors[-1]:
                self.count = 0

class mirror:
    def __init__(self, x, y, x1, y1, type):
        self.x = x
        self.y = y
        self.x1 = x1
        self.y1 = y1
        self.type = type

在代码中,我调用person名为I的对象和名为mirror的{​​{1}}个对象以及mirr类型mirr2。我写的时候:

teleportx

它会更改I.mirrored([mirr, mirr2]) 中所有对象的x。如果我写

I.pos

它仍会更改所有I.pos[3].mirrorise(mirr) 。即使我写道:

x

它会更改所有值。那么,它是一些Python规则还是我有错误?

1 个答案:

答案 0 :(得分:1)

您正在添加对原始obj()个实例的引用:

self.pos.append(self.pos[men])

那不是副本;这只是对同一个对象的另一个引用。

创建 obj()实例:

self.pos.append(obj(self.pos[men].x, self.pos[men].y))