Python 重新分配整个元组是有效的
我正在学习Python中元组的数据结构,我读到元组是不可变的:这意味着我们不能使用赋值运算符(“=”)设置其元素,但我想知道为什么我可以使用赋值运算符设置整个元组,如:Python 重新分配整个元组是有效的,python,tuples,immutability,Python,Tuples,Immutability,我正在学习Python中元组的数据结构,我读到元组是不可变的:这意味着我们不能使用赋值运算符(“=”)设置其元素,但我想知道为什么我可以使用赋值运算符设置整个元组,如: >>> t = (1,2,3) >>> t = (3,4,5) >>> print(t) (3, 4, 5) t=(1,2,3) t=(5,3,9)不是旧元组中的编辑。前一个t变量保存的数据被重新分配给一个新变量,该变量的名称也是t 重要的一点是,t只是我们可能称之为t的
>>> t = (1,2,3)
>>> t = (3,4,5)
>>> print(t)
(3, 4, 5)
t=(1,2,3)
t=(5,3,9)不是旧元组中的编辑。前一个t变量保存的数据被重新分配给一个新变量,该变量的名称也是t
重要的一点是,t只是我们可能称之为t的元组的名称。特别是,您可以通过重新绑定t来为其他东西命名,比如t=2。但是你不能改变元组中的元素
对象的不变性意味着,一旦在内存中创建了对象,它就只能被销毁
这就是Python中变量赋值的工作方式。变量只是名称,分配给变量意味着您要求计算机计算右侧的表达式,并将其值存储到左侧的名称中。这是因为您将元组分配给新变量。您没有更改这些值。 但是你却在创造新的 让我解释一下: 一旦我们声明了元组的内容,就不能修改该元组中的内容。 这并不意味着我们不能将其分配给其他变量 例如,下面是我们如何修改列表的第0个成员:
>>> mylist = [1, 2, 3]
>>> mylist[0] = 69
print(mylist)
[69, 2, 3]
这对元组不起作用:
>>> mytuple = (1, 2, 3)
>>> mytuple[0] = 69
TypeError: 'tuple' object does not support item assignment
我希望你得到了答案。因为给变量赋值和变异完全是两码事。考虑一下例子中的引用和值。您将变量从一个元组重新分配到另一个元组,而不是修改数据
t = (1, 2, 3)
s = (3, 4, 5)
u = (3, 4, 5)
t = s # t = (3, 4, 5)
print(t) # (3, 4, 5)
print(t == s) # True, same values
print(t is s) # True, they point to the same address in memory
print(t == u) # True, same values
print(t is u) # False, they point to different addresses(think physical locations) in memory.
在Python中,您可以重新分配变量,如果您来自其他语言,您可能会习惯于有更多的限制。从这个意义上讲,Python更加松散
对于Python元组,不变性意味着您不能更改原语值,请将它们视为只读:
t = (1, 2, 3)
t[0] += 1 # TypeError: 'tuple' object does not support item assignment
t.append(4) # AttributeError: 'tuple' object has no attribute 'append'
修改tuple意味着您想弄乱它的内部属性。Tuple是Python中的一个对象,所有对象在代码中都表示为指针。可以重新分配指针来表示任何对象,因此可以在Python中动态键入
t = (1,2,3)
# this is valid
t = []
# and this too
t = "string"
t
是指向元组的指针,可以修改元组,但不能修改元组的元素。
考虑这一点:
# create tuple
t = (1,2,3)
# access its first element
print(t[0])
# try to modify first element
t[0] = 5
输出:
1
Traceback (most recent call last):
File "/zzz/scratch.py", line 5, in <module>
t[0] = 5
TypeError: 'tuple' object does not support item assignment
1
回溯(最近一次呼叫最后一次):
文件“/zzz/scratch.py”,第5行,在
t[0]=5
TypeError:“tuple”对象不支持项分配
因为你不是在变异元组,而是在分配一个新的元组?如果我有一块神奇的不透水岩石,我无法以任何方式进行更改,这不会阻止我放下它,然后选择另一块岩石。你在创建一个新的元组,并将变量改为引用它。你只是在移动一个标签,而不是变异任何元组。推荐阅读:赋值不会改变任何对象。不清楚您为什么要显示t=t
。问题不包括t=t
行。分配新值和分配旧值是一样的,但我编辑它,明白了!谢谢。我运行了代码,得到的print(t是u)为True,这很有意义,因为u和s指向相同的地址,s和t指向相同的地址,所以t和s应该指向相同的地址。记住python中的每个变量都是指针这一概念是个好主意。因为这也可以解释为什么像(a,b)=(b,a+b)这样的代码可以工作(这是我最初的问题):这是因为(a,b)是一个指针,也就是说,它存储某个元组的地址,将另一个元组的新地址分配给它就可以了。是吗?如果你把(a,b)
存储在某个变量中,你就可以这样做。语句(a,b)=(b,a+b)
按原样不起作用,因为(a,b)
是一个对象文字,一个语句,而不是一个变量。你只能给变量赋值。你提到的例子(如果我理解正确的话)t=(1,2,3)
然后t=(t[1],t[2]+1,t[0])