在Python中存储对基本类型的引用?

时间:2013-05-23 01:46:16

标签: python reference

代码:

>>> 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]

这可能吗?

5 个答案:

答案 0 :(得分:6)

Python中没有“原语”。一切都是对象,甚至是数字。 Python中的数字是不可变对象。因此,要引用一个数字,以便通过多个引用“看到”对“数字”的“更改”,引用必须通过例如单个元素列表或具有一个属性的对象。

(这是有效的,因为列表和对象是可变的,并且通过对它的所有引用都可以看到它们保持的数字的变化)

e.g。

>>> a = [1]
>>> b = a
>>> a
[1]
>>> b
[1]
>>> a[0] = 2
>>> a
[2]
>>> b
[2]

答案 1 :(得分:3)

你不能在Python中真正做到这一点,但你可以通过使变量ab引用可变容器对象而不是不可变数字来接近:

>>> 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视为引用整数的名称。

整数是不可变的,你可以使名称引用不同的整数,但整数本身不能改变。