为什么我的程序会覆盖这两个对象?

Why does my Program override both Objects?

我正在开发一个程序来创建伪造的副本,它在指定的属性中有某种不一致。

我正在使用我的 class "Firma":

class Firma:
    def __init__(self, firma, strasse, plz, ort, telefon):
        self.firma = firma
        [...]

    def getFirma(self):
       return self.firma
        [...]

    def setFirma(self, firma):
      self.firma = firma
        [...]

    def toString(objekt) -> str:
        result = '"' + objekt.getFirma() + '"\t"' + objekt.getStrasse() + '"\t"' + objekt.getOrt() + '"\t"' + objekt.getPlz() + '"\t"' + objekt.getTelefon() + '"'
        return result

现在我写了这段代码来测试我的方法 "createSchreibfehler" 是否按照我想要的方式产生了错误。

for i in range(100):

    firma = Generator.generateFirma()

    x = firma
    y = firma

    AttributFirma = x.getFirma()
    fehlerString = Szenario.createSchreibfehler(AttributFirma)
    y.setFirma(fehlerString)

    print(Firmendatensatz.Firma.toString(x))
    print(Firmendatensatz.Firma.toString(y))

我得到如下输出:

"Bohlnader" "Lachmannstr. 113"  "Bamberg"   "13669" "01991 351660"
"Bohlnader" "Lachmannstr. 113"  "Bamberg"   "13669" "01991 351660"
or 
"Carsetn"   "Seifertring 139"   "Delitzsch" "64621" "(00423) 19090"
"Carsetn"   "Seifertring 139"   "Delitzsch" "64621" "(00423) 19090"
...

(两个字符串(x 和 y)都存在拼写错误) (为了创建一个 Firma,我正在使用 Faker 包)

一切正常,除了当我使用 y.setFirma(fehlerString).

时它似乎覆盖了我的 x 和 y

你们知道为什么 x 和 y 不仅在我的变量 x 中有错误吗? 我在 JetBrains PyCharm

中使用 Python 3.7.1

你不是在创建两个独立的对象

firma = Generator.generateFirma()

x = firma
y = firma

xy 是引用相同对象数据的名称。您对 x 所做的任何更改都是在 y 也引用的数据上完成的。

这是初学者在使用可变对象时的典型错误 - 最常见的是使用列表:

如果您不需要访问器方法,请删除它们,它们只会使您的结构复杂化。您可以创建一个简单的 clone-ing 方法来创建对象的独立实例并使用它:

class Firma:
    def __init__(self, firma, strasse, plz, ort, telefon):
        self.firma = firma
        self.strasse = strasse 
        self.plz = plz
        self.ort = ort
        self.telefon = telefon

    def CloneMe(self):
        """Returns a clone of this object as independent copy."""
        return Firma(self.firma,self.strasse,self.plz,self.ort,self.telefon)


    def __str__(self):
        # default string method so you can simply print() your object-instances
        return f'"{self.firma}"\t"{self.strasse}"\t"{self.plz}"\t"{self.ort}"\t"{  self.telefon}"'

x = Firma("A", "cstr 42", "4444", "NoWhere"," 0123456789")

# clone and change something

y = x.CloneMe()    
y.ort = "Muenchen"     # no need for get/set methods 

print(x, "=>", id(x))
print(y, "=>", id(y))

输出(不同的数据,不同的ids):

"A" "cstr 42"   "4444"  "NoWhere"   " 0123456789" => 139652937418232   # x
"A" "cstr 42"   "4444"  "Muenchen"  " 0123456789" => 139652937418288   # y