5

代码:

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

这可能吗?

4

5 回答 5

6

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

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

例如

>>> a = [1]
>>> b = a
>>> a
[1]
>>> b
[1]
>>> a[0] = 2
>>> a
[2]
>>> b
[2]
于 2013-05-23T01:48:50.240 回答
5

在 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]
于 2013-05-23T02:07:22.423 回答
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],但不直接指代它。

于 2013-05-23T01:49:23.130 回答
0

l[0]其视为引用对象的名称,a以及a引用整数的名称。

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

于 2013-05-23T02:01:35.587 回答
0

之前有一个相关的讨论: 在 Python 中通过引用将一个列表的元素存储在另一个列表中?

根据@mgilson,在做的时候l[1] = 4,它只是替换了引用,而不是试图改变对象。尽管如此,类型的对象int无论如何都是不可变的。

于 2013-05-23T01:54:09.447 回答