赋值运算符如何创建深层副本?

时间:2018-09-21 09:31:10

标签: python deep-copy assignment-operator

下面是代码

a =2 
b = a
b = 3
print (b,a)
3 2

如果a仅指向3的内存空间而没有自己的内存,我希望b的值也将更改为a

我肯定有一个非常简单的解释,我很想念。

4 个答案:

答案 0 :(得分:2)

不。分配将 reference 复制到对象,而不是对象本身。例如

a = [1, 2, 3]
b = a
b[0] = 5
print(a) # gives [5, 2, 3]

但是

b = a
b = 3

b重新分配为新的整数文字,而与a无关。

也不是您问题的严格内容,但请参见 mutable immutable 对象之间的区别。

答案 1 :(得分:0)

b = ab指向与a相同的对象。但是,当您执行b = 3时,重新分配 b指向另一个对象。 a不受影响。

答案 2 :(得分:0)

这里的问题是,您认为python变量是一个指针,那里一点都不好,但是它们却不能那样工作。您应该将python变量视为值的标签。另外,您还必须考虑可变和不变的数据。 Python字符串和整数是不可变的,这意味着python为每个操作创建一个新数字并将变量重新分配给新数字。

如您的示例:

--------------------------------
|     3    |    2   |   ..     |
--------------------------------

a = 2 # a points to place 1 in our example memmory block
b = a # b points to the same memmory block as a
b = 3 # b change to point to the memmory block where 3 is located, place 0

在这种情况下:

a = 2 # a points to place 1 in our example memmory block
b = a # b points to the same memmory block as a
b += 1 # b == 2, b + 1 == 3, so b will point to a 3, a is still not modified

答案 3 :(得分:0)

如果您重新分配b值,则python将重新分配b,该b具有不同的值和内存位置。然后。打印带有id(a)和id(b)的地址,您可以看到,如果值不同,则内存地址实际上是不同的。

在python shell中尝试:

a = 3
b = a
id(b) == id(a) #it returns True

b = 2
id(b) == id(a) #it returns False