Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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 - Fatal编程技术网

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])