我正在学习Python中Tuple的数据结构,我读到Tuple是不可变的:这意味着我们不能使用赋值运算符("=&"(设置它的元素,但我想知道为什么我可以使用赋值运算符设置整个元组,比如:
>>> t = (1,2,3)
>>> t = (3,4,5)
>>> print(t)
(3, 4, 5)
修改元组意味着您想破坏它的内部属性。元组是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
这是因为要将元组分配给一个新变量。你没有改变价值观。但你却在创造一个新的。
让我解释一下:一旦我们声明了元组的内容,就不能修改该元组中的内容。这并不意味着我们不能将其分配给不同的变量。
例如,以下是我们如何修改列表的第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'
t=(1,2,3(
t=(5,3,9(不是旧元组中的编辑。前一个t变量保存的数据被重新分配给一个新变量,该变量的名称也是t。
重要的一点是,t只是我们可能称之为t的元组的名称。特别是,您可以通过重新绑定它来使t成为其他事物的名称,比如t=2。但是您不能更改元组中的元素!
对象的不变性意味着,一旦在内存中创建了对象,它就只能被破坏
这就是Python中变量赋值的工作方式。变量只是名称,分配给变量意味着你要求计算机计算右手边的表达式,并将其值存储到左手边的名称中。