Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重新分配整个元组是有效的_Python_Tuples_Immutability - Fatal编程技术网

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的

我正在学习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来为其他东西命名,比如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])