提问人:Aleks K. 提问时间:1/20/2022 最后编辑:Aleks K. 更新时间:1/20/2022 访问量:11
重新同化变量
Reassining variables
问:
我正在做一个测试项目只是为了训练我的 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,所以它们指向同一个对象,而在字符串的情况下,一开始它们具有相同的值,但它们没有引用同一个对象。那么在这种情况下,我将如何获取列表的副本而不是引用相同的对象?也许我可以在“测试”方法的开头分配一个副本,但是有没有办法通过传递参数来做到这一点?
很抱歉,如果这是一个重复的问题,我找不到答案。
答:
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
评论