【问题标题】:How is the assignment operator creating a deep copy?赋值运算符如何创建深层副本?
【发布时间】:2019-02-25 16:26:23
【问题描述】:

下面是代码

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

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

我确信我缺少一个非常简单的解释。

【问题讨论】:

标签: python deep-copy assignment-operator


【解决方案1】:

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

【讨论】:

    【解决方案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 对象之间的区别。

    【讨论】:

      【解决方案3】:

      这里的问题是你认为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
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 1970-01-01
          • 2016-06-21
          • 1970-01-01
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 2011-07-23
          • 2020-11-19
          相关资源
          最近更新 更多