重新同化变量

Reassining variables

提问人:Aleks K. 提问时间:1/20/2022 最后编辑:Aleks K. 更新时间:1/20/2022 访问量:11

问:

我正在做一个测试项目只是为了训练我的 Python,我偶然发现了一些我不太理解的东西,所以如果有人向我解释,我将不胜感激。

下面,我给出了两个类似的测试脚本,它们给出了不同的结果,我不知道为什么会这样:

class Test:
    
    def __init__(self):
        self.test = ""
        self.testing("test_word", self.test)


    def testing(self, word, test_var):
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test = word

        print(f"{self.test = }")
        print(f"{test_var = }")

if __name__ == "__main__":
    Test()

class Test1:
    
    def __init__(self):
        self.test = ["", ""]
        self.testing("test_word", self.test)


    def testing(self, word, test_var):
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test[0] = word

        print(f"{self.test = }")
        print(f"{test_var = }")

if __name__ == "__main__":
    Test1()

[我不明白的]

为什么在列表(Test1)的情况下,当我将“self.test”中的第一个项目分配给“test_word”时,它也会将其分配给本地的,已经传递的列表“test_var”,而在另一个示例(Test)中,当使用字符串变量时,我将“self.test”分配给“test_word”,但本地“test_var”参数仍然是空字符串。我认为这两个 Test 类应该给出相同的输出,那么为什么不呢?

P.S:我做了更多的测试,发现在列表的情况下,test_var是 self.test,所以它们指向同一个对象,而在字符串的情况下,一开始它们具有相同的值,但它们没有引用同一个对象。那么在这种情况下,我将如何获取列表的副本而不是引用相同的对象?也许我可以在“测试”方法的开头分配一个副本,但是有没有办法通过传递参数来做到这一点?

很抱歉,如果这是一个重复的问题,我找不到答案。

OOP 参数 参数 传递 变量赋值

评论


答:

0赞 Aleks K. 1/20/2022 #1

我想我主要回答了我自己的问题。

这里有一堆测试,你可以复制粘贴并执行这些测试来查看差异:

class Test:

    def __init__(self):
        self.test = ""
        self.testing("test_word", self.test)


    def testing(self, word, test_var):
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test()

class Test0:

    def __init__(self):
        self.test = ""
        self.testing("test_word")


    def testing(self, word):
        test_var = self.test
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test0()

class Test1:

    def __init__(self):
        self.test = ["", ""]
        self.testing("test_word", self.test)


    def testing(self, word, test_var):
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test[0] = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test1()

class Test2:

    def __init__(self):
        self.test = ["", ""]
        self.testing("test_word")


    def testing(self, word):
        test_var = self.test
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test[0] = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test2()

class Test3:

    def __init__(self):
        self.test = ["", ""]
        self.testing("test_word")


    def testing(self, word):
        test_var = self.test.copy()
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test[0] = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test3()

class Test4:
    
    def __init__(self):
        self.test = ["", ""]
        self.testing("test_word", self.test.copy())


    def testing(self, word, test_var):
        print(f"{self.test = }")
        print(f"{test_var = }")

        self.test[0] = word

        print(f"{self.test = }")
        print(f"{test_var = }")
        print(test_var is self.test)

if __name__ == "__main__":
    print("-"*50)
    Test4()

输出:

--------------------------------------------------
self.test = ''
test_var = ''
self.test = 'test_word'
test_var = ''
False
--------------------------------------------------
self.test = ''
test_var = ''
self.test = 'test_word'
test_var = ''
False
--------------------------------------------------
self.test = ['', '']
test_var = ['', '']
self.test = ['test_word', '']
test_var = ['test_word', '']
True
--------------------------------------------------
self.test = ['', '']
test_var = ['', '']
self.test = ['test_word', '']
test_var = ['test_word', '']
True
--------------------------------------------------
self.test = ['', '']
test_var = ['', '']
self.test = ['test_word', '']
test_var = ['', '']
False
--------------------------------------------------
self.test = ['', '']
test_var = ['', '']
self.test = ['test_word', '']
test_var = ['', '']
False