重新分配整个元组是有效的



我正在学习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中变量赋值的工作方式。变量只是名称,分配给变量意味着你要求计算机计算右手边的表达式,并将其值存储到左手边的名称中。

最新更新