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

Python 赋值运算符如何创建深度副本?,python,deep-copy,assignment-operator,Python,Deep Copy,Assignment Operator,下面是代码 a =2 b = a b = 3 print (b,a) 3 2 如果b只指向a的内存空间,并且没有自己的内存,我希望a的值也会变为3 我确信有一个非常简单的解释我没有找到。b=a将b指向与a相同的对象。但当您执行b=3时,会重新指定b以指向不同的对象不受影响。否。赋值将引用复制到对象,而不是对象本身。乙二醇 a = [1, 2, 3] b = a b[0] = 5 print(a) # gives [5, 2, 3] 但是, b = a b = 3 将b重新分配给新的整数文

下面是代码

a =2 
b = a
b = 3
print (b,a)
3 2
如果
b
只指向
a
的内存空间,并且没有自己的内存,我希望
a
的值也会变为
3


我确信有一个非常简单的解释我没有找到。

b=a
b
指向与
a
相同的对象。但当您执行
b=3
时,会重新指定
b
以指向不同的对象<代码>不受影响。

否。赋值将引用复制到对象,而不是对象本身。乙二醇

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

b = a
b = 3
b
重新分配给新的整数文本,与
a
无关


另外,严格说来,这不是问题的一部分,但可以看到可变对象和不可变对象之间的区别。

这里的问题是,您将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

如果重新分配值b,python将重新分配具有不同值和内存loc的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

赋值从不创建复制读取此
b=3
不修改现有值;它将一个新值绑定到
b
。您可以使用与
a
相同的编号将
b=a
指向
b
,但是当您使用
b=3
时,您可以将其指向其他地方。对于这个问题有很好的解释: