为什么我需要在Python中复制类实例,而无需复制其他对象类型?

温海军上将

我为何时需要在Python中显式复制对象以进行更改而不更改原始对象时感到有些困惑。Python的文档页面并没有太多的细节,并简单地说,“赋值语句不创建副本”。

范例1:

>>> a = 4
>>> b = a
>>> b += 1
>>> print(b)
>>> print(a)

# Results are what you'd "expect" them to be:
5
4

范例2:

>>> class Test():
>>>     def __init__(self, x):
>>>         self.x = x
>>> 
>>> A = Test(4)
>>> B = A
>>> B.x += 1
>>> print(B.x)
>>> print(A.x)

# Unexpected results because B isn't actually a copy of A:
5
5

为什么两个示例的行为不同?

编辑:为了使示例2正常工作,我基本上做了以下工作。我在问为什么示例1不需要这样做:

>>> import copy
>>> A = Test(4)
>>> B = copy.copy(A)
>>> B.x += 1
>>> print(B.x)
>>> print(A.x)
用户
a = 4
b = a

……的意思是“使人ba所指”。在这种情况下为4。由于整数是不可改变的,改变b这样做b += 1会使它指向一个不同的对象

检查他们的ID

a = 4
b = a

print(id(a)) # Same id
print(id(b)) # Same id

b = 123

print(id(b)) # Different id

当B不是a时,实例A和B也会发生相同的情况.copy()

id(对象)

返回对象的“身份”。


一个带有可变对象的有趣示例

l = [1, 2]
k = l

print(id(l)) # Same id
print(id(k)) # Same id

k.append(3)

print(id(k)) # Same id
print(l, k)  # Prints [1, 2, 3] [1, 2, 3]

append()同时修改对象kl引用。它不会为分配其他对象k

如@blcckngth所述:

k = k + [3]

print(id(k)) # Different id ..
print(l, k)  # ..prints [1, 2] [1, 2, 3]

k += [3]会导致引用同一对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我是否需要在子类中复制类型注释?

来自分类Dev

为什么字典作为类的引用传递而其他类型被复制?

来自分类Dev

为什么复制构造函数会自动将我的数据转换为其他类型?

来自分类Dev

复制相同元素而无需添加其他代码

来自分类Python

我为什么要在熊猫中复制数据框

来自分类Dev

为什么需要双指针来更改头部,而无需更改链接列表中的其他位置

来自分类Dev

为什么我不能从Vim中的其他程序粘贴和复制?

来自分类Dev

为什么我的代码只复制第一个零而不复制其他的?

来自分类Dev

为什么我们需要在这里复制u的值?

来自分类Dev

使用Angular 2时,是否需要在Typescript中复制我的Entity Framework类?

来自分类Dev

为什么类型/类统一主要在python中

来自分类Dev

我可以在其他类中使用已声明的对象,而无需再次声明该对象吗?

来自分类Dev

合并数据框而无需在python pandas中复制行

来自分类Dev

在Python中合并DataFrame,而无需复制列

来自分类Dev

做出反应。为什么一个 FC 中的 css 类可以在其他组件中工作而无需导入?

来自分类Dev

为什么删除的复制构造函数不允许使用多态类型的其他构造函数?

来自分类Dev

为什么复制的对象具有与以前在Python中复制的对象相同的ID?

来自分类Python

如何在python中复制类实例?

来自分类Dev

从Python中的实例复制构造基类

来自分类Dev

当将类实例复制到列表时,为什么要删除类中的转换列表?

来自分类Dev

Python:对类对象的其他实例的引用

来自分类Dev

为什么我需要在Swift的类中指定变量的类型?

来自分类Dev

我们为什么要在某些递归算法中复制ArrayList?

来自分类Dev

为什么需要在这段代码中创建一个类的实例?

来自分类Java

当我使用其他变量时,为什么要用Java复制而不是创建新的Instant?

来自分类Dev

复制派生类的构造函数,而无需测试所有类型?

来自分类Dev

我的所有方法都需要通用包装,而无需复制代码(C#)

来自分类Dev

为什么我允许“直接访问”对象的受保护字段,该对象的类在其他包中定义?

来自分类Dev

在python中实例化类的对象的类型是什么?

Related 相关文章

  1. 1

    我是否需要在子类中复制类型注释?

  2. 2

    为什么字典作为类的引用传递而其他类型被复制?

  3. 3

    为什么复制构造函数会自动将我的数据转换为其他类型?

  4. 4

    复制相同元素而无需添加其他代码

  5. 5

    我为什么要在熊猫中复制数据框

  6. 6

    为什么需要双指针来更改头部,而无需更改链接列表中的其他位置

  7. 7

    为什么我不能从Vim中的其他程序粘贴和复制?

  8. 8

    为什么我的代码只复制第一个零而不复制其他的?

  9. 9

    为什么我们需要在这里复制u的值?

  10. 10

    使用Angular 2时,是否需要在Typescript中复制我的Entity Framework类?

  11. 11

    为什么类型/类统一主要在python中

  12. 12

    我可以在其他类中使用已声明的对象,而无需再次声明该对象吗?

  13. 13

    合并数据框而无需在python pandas中复制行

  14. 14

    在Python中合并DataFrame,而无需复制列

  15. 15

    做出反应。为什么一个 FC 中的 css 类可以在其他组件中工作而无需导入?

  16. 16

    为什么删除的复制构造函数不允许使用多态类型的其他构造函数?

  17. 17

    为什么复制的对象具有与以前在Python中复制的对象相同的ID?

  18. 18

    如何在python中复制类实例?

  19. 19

    从Python中的实例复制构造基类

  20. 20

    当将类实例复制到列表时,为什么要删除类中的转换列表?

  21. 21

    Python:对类对象的其他实例的引用

  22. 22

    为什么我需要在Swift的类中指定变量的类型?

  23. 23

    我们为什么要在某些递归算法中复制ArrayList?

  24. 24

    为什么需要在这段代码中创建一个类的实例?

  25. 25

    当我使用其他变量时,为什么要用Java复制而不是创建新的Instant?

  26. 26

    复制派生类的构造函数,而无需测试所有类型?

  27. 27

    我的所有方法都需要通用包装,而无需复制代码(C#)

  28. 28

    为什么我允许“直接访问”对象的受保护字段,该对象的类在其他包中定义?

  29. 29

    在python中实例化类的对象的类型是什么?

热门标签

归档