更改元组元素的值

时间:2016-08-23 03:34:02

标签: 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值的变化?

5 个答案:

答案 0 :(得分:1)

这与元组关系不大,更多地与Python中的赋值如何工作有关,复制与引用有关。

这适用于其他容器类型(列表)和纯变量。

>>> a = 2
>>> b = [1, a]
>>> a = 7
>>> b
[1, 2]
>>> c = 1
>>> d = c
>>> c = 2
>>> d
1

答案 1 :(得分: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是不可变的,每次为其赋值时,都会创建新对象。

对可变类型重复相同(可以就地修改)

>>> ls1 = [1,2]
>>> ls2 = [3,4]
>>> t = (ls1, ls2)
>>> ls1[0] = 23
>>> t
([23, 2], [3, 4])
>>> id(ls1)
54696136
>>> id(t[0])
54696136
#here t[0] and ls1 are same object because we could modify ls1 in place

我希望它会有所帮助。

答案 2 :(得分:1)

首先,python中元组中的值无法更改。您只能声明一个新元组。

a = 25表示a是一个变量。但是,a中的t属于元组t。它与变量a没有任何关系。

第二个t = (a, b)t = (50, 50)

相同

此外,您可以使用id(a)id(t)查看内存地址的差异。

答案 3 :(得分:0)

如果我们执行一个像a = b这样的赋值动作而b是不可变的(数字,字符串,元组等),则assign将复制而不是引用。因此,修改为b不会影响。

对于可变的情况:

>>> a = []
>>> b = 3
>>> c = (a, b)
>>> c
([], 3)
>>> a.append(1)
>>> c
((1], 3)

答案 4 :(得分:0)

很简单。在Python中,名称(例如abt不是对象,它们只是指向对象。当你输入

>>> a = 25
>>> b = 50

Python将名称a设置为指向int对象,其值为25b指向int对象,其值为50 }。

使用

创建元组时
>>> t = a, b

(这里不需要括号!)你告诉Python"请创建一个包含2个元素的新元组,其中第一个位置应该指向a 的对象现在指向,第二个位置应指向b 现在指向的对象。实际上它可以与列表类似地工作,或者也可以设置:

>>> l = [a, b]
>>> s = {a, b}

现在是下一个声明:

>>> a = 50

表示"现在,将a设置为指向值为int"的50对象。元组的第一个元素仍然指向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]表示*创建一个新列表......现在让a指向它。 Python中的变量(名称)确实不是" box",但它们是指向值的符号。