好吧,让我试着用一些图片来解释一下。
在 Python 中,一切都是对象。这些对象由变量引用。某些类型的对象,例如列表和元组,只是存储对其他对象的引用。
也就是说,当你执行时
myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
您或多或少会遇到这种情况:
每个对象都由一个框/矩形表示。我们有两个字符串对象,"jhhj" 和 "hgc"。另外,我们有一个列表对象,由变量myVar 指向;此列表对象指向两个字符串对象。另外,我们有一个元组对象,由myTuple 引用;这个元组对象指向另外两个列表和myVar引用的列表。
当你执行时
myVar.append('lololol')
会发生什么?好吧,列表对象(顺便提一下myVar)开始引用另一个值,字符串对象"lololol":
请注意,myVar 仍然引用列表对象。发生的事情是列表对象改变了。您可以从myVar 或元组中查看此列表对象,您将看到具有相同更改的相同对象。
OTOH,当你执行时
myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
你会得到这样的东西:
现在myVar 指向字符串对象"lol",并且元组在其第三个位置引用它。现在,如果你执行
myVar = "lolol"
你只是让myVar 指向另一个对象。元组对象仍然像以前一样指向"lol":
所以,如果你给一个变量赋予一个新值,它只会改变这个变量所指向的值。变量引用的先前值将仍然存在*,并且指向它的任何其他变量或对象将保持指向它。只是属性变量会改变。
PS:另外,I answered a vaguely related question some time ago。您可能会发现答案很有帮助。
* 除非是被垃圾回收器回收,不过这又是一段漫长的历史了。