我進入在命令行中執行以下操作:更改元組元素的值
>>>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
的價值的變化?
我進入在命令行中執行以下操作:更改元組元素的值
>>>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中,名稱(如a
和b
和t
)不是對象,它們只是指向對象。當你進入
>>> a = 25
>>> b = 50
Python的設置名稱a
指向一個int
對象與價值25
和b
指向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中的變量(名稱)確實不是「框」,但它們是指向值的標誌。
謝謝。很有幫助。 – BruceM
這與元組更少有關,而更多的工作是如何在Python中複製vs引用的工作方式。
這適用於其他容器類型(列表)和普通變量。
>>> a = 2
>>> b = [1, a]
>>> a = 7
>>> b
[1, 2]
>>> c = 1
>>> d = c
>>> c = 2
>>> d
1
沒有複製完成。只是'a'和列表的第一個元素是相同的值。當「a」被重新分配時,它僅僅意味着「a」指的是不同的對象。它不會改變列表的第一個元素。 – zondo
你可以把它理解了這種方式: -
>>> 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
我希望這會有所幫助。
首先,python中的元組值不能改變。你只能聲明一個新的元組。
a = 25
表示a
是一個變量。然而,在t
屬於元組t。它與變量a
沒有任何關係。
第二t = (a, b)
爲相同t = (50, 50)
此外,您可以使用id(a)
和id(t)
看到你的內存地址的差異。
如果我們執行像a = b這樣的賦值操作,並且b是不可變的(數字,字符串,元組等),則賦值將複製而不是引用。因此,修改爲b不會影響a。
對於易變的情況:
>>> a = []
>>> b = 3
>>> c = (a, b)
>>> c
([], 3)
>>> a.append(1)
>>> c
((1], 3)
元組概念的一部分是你不能改變它們的值。如果您想更改變量索引的值,則可能需要使用列表。 –
這就是它的工作方式。對列表來說同樣的事情:'[a,b]'給你'[25,50]',並且不支持對'a'或'b'的引用。對於這個問題變量同樣如此:如果你做'x = a',那麼'a = 75'不會影響'x'。 – Blorgbeard
另請參閱http://stackoverflow.com/questions/6158907/what-does-python-treat-as-reference-types – Blorgbeard