为什么当我附加到其中的列表时元组的内容会发生变化,但是当我更新变量时它没有改变?

Web*_*ter 7 python tuples list append variable-assignment

myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
myVar.append('lololol')
print myTuple
Run Code Online (Sandbox Code Playgroud)

为什么以及如何通过在施工后附加来修改这个元组?

myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
myVar = "lolol"
print myTuple
Run Code Online (Sandbox Code Playgroud)

为什么打印出来([1,2,3], [4,5,6], "lol")而不是([1,2,3], [4,5,6], "lolol")

bra*_*zzi 7

好吧,让我试着用一些图片来解释.

在Python中,一切都是对象.这些对象由变量引用.某些类型的对象(如列表和元组)只存储对其他对象的引用.

那说,当你执行

myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
Run Code Online (Sandbox Code Playgroud)

您或多或少会遇到这种情况:

一个指向三个列表的元组;  一个指向两个字符串的列表

每个对象由一个框/矩形表示.我们有两个字符串对象,"jhhj""hgc".另外,我们有一个由变量指向的列表对象myVar; 此列表对象指向两个字符串对象.此外,我们有一个元组对象,引用myTuple; 这个元组对象指向另外两个列表和引用的列表myVar.

当你执行

myVar.append('lololol')
Run Code Online (Sandbox Code Playgroud)

会发生什么?好吧,列表对象(顺便指出myVar)开始引用另一个值,即字符串对象"lololol":

一个指向三个列表的元组;  一个指向两个字符串的列表;  将新字符串添加到列表中

请注意,myVar仍然引用列表对象.发生的事情是列表对象发生了变化.您可以myVar从元组中查看此列表对象,您将看到具有相同更改的相同对象.

OTOH,当你执行时

myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
Run Code Online (Sandbox Code Playgroud)

你得到这样的东西:

指向两个列表和一个字符串的元组,也由变量指向

现在myVar指向字符串对象"lol",以及元组在其第三个位置引用它.现在,如果你执行

myVar = "lolol"
Run Code Online (Sandbox Code Playgroud)

你只是myVar指向另一个对象.元组对象仍然"lol"像以前一样指向:

指向两个列表和一个字符串的元组,也由变量指向. 该变量现在引用另一个字符串.

因此,如果将新值归因于变量,则只会更改此变量指向的值.变量引用的先前值仍然存在*,指向它的任何其他变量或对象将保持指向它.只是属性变量会改变.

PS:此外,我前段时间回答了一个含糊不清的问题.您可能会发现答案很有帮助.

*除非它是由垃圾收集器收集,但这是另一个漫长的历史.


Ant*_*ile 5

python中的所有东西都是对象.

所以当你做原始作业时

myVar = "lol"

你给myVar一个对象"lol"的引用

然后创建一个元组.第三个插槽中的这个元组引用了"lol"

然后你创建一个新对象"lolol"并给myVar一个引用它.元组保留其原始引用"lol"