好吧,让我尝试用一些图像来解释。
在 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
指向字符串 object "lol"
,并且元组在其第三个位置引用它。现在,如果你执行
myVar = "lolol"
您只是myVar
在指向另一个对象。元组对象仍然像以前一样指向"lol"
:
所以,如果你给一个变量赋予一个新值,它只会改变这个变量所指向的值。变量引用的先前值将仍然存在*,并且指向它的任何其他变量或对象将保持指向它。只是属性变量会改变。
PS:另外,我前段时间回答了一个模糊相关的问题。您可能会发现答案很有帮助。
* 除非它是由垃圾收集器收集的,但这是另一个漫长的历史。