代码:
>>> a = 1
>>> b = 2
>>> l = [a, b]
>>> l[1] = 4
>>> l
[1, 4]
>>> l[1]
4
>>> b
2
我希望看到的是,当我将l [1]设置为4时,变量b变为4。
我猜测在处理基元时,它们是按值复制的,而不是通过引用复制的。我经常看到人们遇到物体问题,需要了解深层副本等。我基本上想要相反。我希望能够将引用存储到列表中的原语,然后能够通过使用其实际变量名b
或其中的引用来为该变量分配新值。列出l[1]
。
这可能吗?
答案 0 :(得分:6)
Python中没有“原语”。一切都是对象,甚至是数字。 Python中的数字是不可变对象。因此,要引用一个数字,以便通过多个引用“看到”对“数字”的“更改”,引用必须通过例如单个元素列表或具有一个属性的对象。
(这是有效的,因为列表和对象是可变的,并且通过对它的所有引用都可以看到它们保持的数字的变化)
e.g。
>>> a = [1]
>>> b = a
>>> a
[1]
>>> b
[1]
>>> a[0] = 2
>>> a
[2]
>>> b
[2]
答案 1 :(得分:3)
你不能在Python中真正做到这一点,但你可以通过使变量a
和b
引用可变容器对象而不是不可变数字来接近:
>>> a = [1]
>>> b = [2]
>>> lst = [a, b]
>>> lst
[[1], [2]]
>>> lst[1][0] = 4 # changes contents of second mutable container in lst
>>> lst
[[1], [4]]
>>> a
[1]
>>> b
[4]
答案 2 :(得分:1)
我认为这不可行:
>>> lst = [1, 2]
>>> a = lst[1] # value is copied, not the reference
>>> a
2
>>> lst[1] = 3
>>> lst
[1, 3] # list is changed
>>> a # value is not changed
2
a
是指lst[1]
的原始值,但不直接引用它。
答案 3 :(得分:0)
之前有相关的讨论: Storing elements of one list, in another list - by reference - in Python?
根据@mgilson的说法,在做l[1] = 4
时,它只是替换了引用,而不是试图改变对象。然而,类型int
的对象无论如何都是不可变的。
答案 4 :(得分:0)
将l[0]
视为引用对象a
的名称,将a
视为引用整数的名称。
整数是不可变的,你可以使名称引用不同的整数,但整数本身不能改变。