我进入在命令行中执行以下操作:更改元组元素的值
>>>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