Python 更改元组元素的值
我在命令行中输入了以下内容:Python 更改元组元素的值,python,tuples,Python,Tuples,我在命令行中输入了以下内容: >a=25 >>>b=50 >>>t=(a,b) >>>t (25, 50) >>>a=50 >>>t (25, 50) >>>t=(a,b) >>>t (50, 50) 为什么我必须将元组(a,b)重新分配给t,才能看到a值的变化?这与元组关系不大,而与Python中复制vs引用的赋值工作方式关系更大 这适用于其他容器类型(列表)和普通变量 >>> a = 2 >>> b = [1, a] >>> a = 7
>a=25
>>>b=50
>>>t=(a,b)
>>>t
(25, 50)
>>>a=50
>>>t
(25, 50)
>>>t=(a,b)
>>>t
(50, 50)
为什么我必须将元组
(a,b)
重新分配给t
,才能看到a
值的变化?这与元组关系不大,而与Python中复制vs引用的赋值工作方式关系更大
这适用于其他容器类型(列表)和普通变量
>>> a = 2
>>> b = [1, a]
>>> a = 7
>>> b
[1, 2]
>>> c = 1
>>> d = c
>>> c = 2
>>> d
1
您可以这样理解:
>>> a =25
>>> b = 50
>>> id(a)
6070712
>>> t = (a, b)
>>> id(t[0])
6070712
>>> a = 50
>>> id(a)
6070412
# When you assigned a = 50, it created new object,
#id(t[0]) and a is not same now, so t is still (25, 50)
发生这种情况是因为int
是不可变的,每次给它赋值时,都会创建新对象
对可变类型重复相同操作(可以就地修改)
我希望这会有所帮助。首先,python中tuple的值不能更改。您只能声明一个新的元组
a=25
表示a
是一个变量。然而,t
中的a
属于元组t。它与变量a
没有任何关系
第二个t=(a,b)
与t=(50,50)
此外,您可以使用
id(a)
和id(t)
来查看内存地址的差异。如果我们执行赋值操作,例如a=b,b是不可变的(数字、字符串、元组等),assign将生成一个副本而不是引用。因此,修改为b不会影响a
对于可变情况:
>>> a = []
>>> b = 3
>>> c = (a, b)
>>> c
([], 3)
>>> a.append(1)
>>> c
((1], 3)
这很简单。在Python中,名称,例如
a
和b
和t
不是对象,它们只是指向对象。当你进入
>>> a = 25
>>> b = 50
Python将名称a
设置为指向具有值25
的int
对象,将b
设置为指向具有值50
的int
对象
使用创建元组时
>>> t = a, b
(此处不需要括号!)您告诉Python“请创建一个包含2个元素的新元组,其中第一个位置应指向a
现在指向的对象,第二个位置应指向b
现在指向的对象。实际上,它与列表或集合的工作方式类似:
>>> l = [a, b]
>>> s = {a, b}
现在是下一个声明:
>>> a = 50
表示“现在,将a
设置为指向值为50
”的int
对象。元组的第一个元素仍然指向25
。实际上,所有变量赋值在Python中都是这样的,即a
中的值是否可变:
>>> a = [1, 2]
>>> b = [3, 4]
>>> t = a, b
>>> a = [5, 6]
>>> t
([1, 2], [3, 4])
即使
a
指向一个可变值,一个列表,然后a,b
意味着*创建一个新的元组,第一个元素是a
此时指向的对象,第二个元素是b
此时指向的对象;然后a=[5,6]
means*创建一个新列表……现在让a
指向它。Python中的变量(名称)实际上不是“框”“,但它们是指向价值的某种符号 元组概念的一部分是不能更改它们的值。如果要更改变量索引的值,可能需要使用列表。这就是它的工作方式。。列表也是一样:[a,b]
提供了[25,50]
并且不保留对a
或b
的引用。变量也是如此:如果你做了x=a
,那么a=75
不会影响x
。另外,你应该阅读Ned Batchelder的文章,了解非常有用的回答。不会复制。只是a
和列表的第一个元素是相同的值。当a
被重新分配时,这仅仅意味着a
指的是不同的对象。它不会改变列表的第一个元素是什么。谢谢。非常有用。
>>> a = [1, 2]
>>> b = [3, 4]
>>> t = a, b
>>> a = [5, 6]
>>> t
([1, 2], [3, 4])