2016-08-23 137 views
-1

我进入在命令行中执行以下操作:更改元组元素的值

>>>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的价值的变化?

+2

元组概念的一部分是你不能改变它们的值。如果您想更改变量索引的值,则可能需要使用列表。 –

+0

这就是它的工作方式。对列表来说同样的事情:'[a,b]'给你'[25,50]',并且不支持对'a'或'b'的引用。对于这个问题变量同样如此:如果你做'x = a',那么'a = 75'不会影响'x'。 – Blorgbeard

+0

另请参阅http://stackoverflow.com/questions/6158907/what-does-python-treat-as-reference-types – Blorgbeard

回答

0

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

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

Python的设置名称a指向一个int对象与价值25b指向int对象与价值50

当你创建一个元组

>>> t = a, b 

(这里不需要括号!)你告诉Python“请创建一个新元组,其中第一个位置应指向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中的变量(名称)确实不是“框”,但它们是指向值的标志。

+0

谢谢。很有帮助。 – BruceM

1

这与元组更少有关,而更多的工作是如何在Python中复制vs引用的工作方式。

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

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

没有复制完成。只是'a'和列表的第一个元素是相同的值。当“a”被重新分配时,它仅仅意味着“a”指的是不同的对象。它不会改变列表的第一个元素。 – zondo

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 

我希望这会有所帮助。

1

首先,python中的元组值不能改变。你只能声明一个新的元组。

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

第二t = (a, b)为相同t = (50, 50)

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

0

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

对于易变的情况:

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