为什么元组的内容在我附加到它内部的列表时会发生变化,而在更新变量时却没有改变?

2024-09-24 22:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

^{pr2}$

为什么要打印([1,2,3], [4,5,6], "lol")而不是{}?在


Tags: 元组printlolappendmyvarpr2mytuplehgc
3条回答

元组是不可变的,所以如果要修改元组的一个成员,就需要构造一个新的元组。。。在

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

在Python中,一切都是一个对象。这些对象被变量引用。有些类型的对象,如列表和元组,只存储对其他对象的引用。在

也就是说,当你执行死刑时

myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)

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

A tuple pointing to three lists; a list pointing to two strings

每个对象都由一个框/矩形表示。我们有两个字符串对象,"jhhj""hgc"。另外,我们还有一个list对象,由变量myVar指向;这个list对象指向两个string对象。另外,我们还有一个tuple对象,由myTuple引用;这个tuple对象指向另外两个列表和{}引用的列表。在

当你执行

^{pr2}$

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

A tuple pointing to three lists; a list pointing to two strings; a new string is added to the list

注意,myVar仍然引用list对象。结果列表对象改变了。您可以从myVar或元组中查看此列表对象,您将看到具有相同更改的同一对象。在

奥托,当你执行死刑的时候

myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)

你会得到这样的结果:

A tuple pointing to two lists and a string, also pointed by a variable

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

myVar = "lolol"

您只是使myVar指向另一个对象。tuple对象仍然像以前一样指向"lol"

A tuple pointing to two lists and a string, also pointed by a variable. The variable now references another string.

所以,如果你把一个新值赋给一个变量,它只会改变这个变量所指向的值。变量引用的前一个值仍将存在*并且指向它的任何其他变量或对象将保持指向该值。只是属性变量会改变。在

另外,I answered a vaguely related question some time ago。你可能会发现答案很有帮助。在

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

python中的所有东西都是对象。在

所以当你完成最初的任务时

myVar = "lol"

你在给myVar一个对象“lol”的引用

然后创建一个元组。第三个槽中的这个元组引用了“lol”

然后创建一个新对象“lolo”,并给myVar一个引用。元组保留了对“lol”的原始引用

相关问题 更多 >