【发布时间】:2017-01-31 22:44:34
【问题描述】:
Python 使用名称来引用对象。当我们说a = b、a 和b 现在指的是同一个对象,如果我们更改a,我们将在b 中看到相同的更改。例如:
a = [1, 2, 3]
b = a
a.append(4)
print(b)
将打印[1, 2, 3, 4]。
但是,某些操作确实会创建新对象。例如:
a = 1
b = a
a = a + 1
print(b)
将打印1。显然a = a + 1 行以某种方式创建了一个值为a + 1 的新对象,并将名称a 绑定到它。这是如何运作的?在这种情况下创建新对象的机制是什么?
这个问题不是 this one 的重复问题,因为我特别问的是在这种情况下对象创建是如何发生的,而另一个问题更普遍地是关于名称何时共享对象。
【问题讨论】:
-
列表是可变的(使用
copy或使用[:]切片来复制它们),整数是不可变的(它们每次都重新构建,就像字符串一样) -
从技术上讲,我不确定
a = a + 1在这种特殊情况下 创建 一个新对象,因为 Python 缓存了 [-5, 256] 范围内的整数。相反,我认为这会将缓存中的预制整数对象分配给a。换句话说,a现在将指向与b不同的对象,但在该语句中没有创建对象。不过,如果我错了,请纠正我。 -
类似,但问题不同。我的问题具体询问在给定操作中如何以及为什么创建新对象。旧的更一般地询问对象引用。
-
Tagc,我认为您对小整数的看法是正确的,因此请考虑大整数的相同问题。
标签: python