我在命令行输入以下内容:
>>>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
值的变化?
答案 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中,名称(例如a
和b
和t
不是对象,它们只是指向对象。当你输入
>>> a = 25
>>> b = 50
Python将名称a
设置为指向int
对象,其值为25
,b
指向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",但它们是指向值的符号。