2016-08-23 171 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)