python何时使用copy.copy

时间:2011-08-12 22:26:51

标签: python

我想我已经开始理解python了,但是我仍然遇到一个基本问题。何时使用copy.copy

>>>a=5
>>>b=a
>>>a=6
>>>print b
5

好的,有道理。但在什么情况下说b=a在a和b之间形成某种“链接”,以便修改a会修改b?这是我不了解copy.copy - 每次使用等号将一个变量分配给另一个变量时,只需复制该值吗?

2 个答案:

答案 0 :(得分:25)

基本上,b = ab指向a点,而不是其他任何内容。

你要问的是可变类型。数字,字符串,元组,frozensets,布尔值,None是不可变的。列表,字典,集合,字节数组都是可变的。

如果我制作一个可变类型,例如list

>>> a = [1, 2]  # create an object in memory that points to 1 and 2, and point a at it
>>> b = a       # point b to wherever a points
>>> a[0] = 2    # change the object that a points to by pointing its first item at 2
>>> a
[2, 2]
>>> b
[2, 2]

他们俩都会指向同一个项目。

我也会评论您的原始代码:

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5

您可以通过id(something)始终查看记忆中的内容。

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5

如果要复制结构,请使用copy。但是,仍然不会复制interned 的内容。这包括小于256TrueFalseNone的整数,a等短字符串。基本上,你几乎应该从不使用它,除非你确定你不会因为实习而搞砸。

再考虑一个例子,即使使用可变类型,将一个变量指向一个新的仍然不会改变旧变量:

>>> a = [1, 2]
>>> b = a
>>> a = a[:1]    # copy the list a points to, starting with item 2, and point a at it
>>> b            # b still points to the original list
[1, 2]
>>> a
[1]
>>> id(b)
79367984
>>> id(a)
80533904

切片列表(无论何时使用:)都会复制。

答案 1 :(得分:4)

作业永远不会复制。它只是将对象a引用(坚持示例)链接到bab引用相同的对象,直到您更改其中的链接。

将“变量”作为术语删除是有用的,它只是放在一个对象上的标签,一个可以用来通过该对象的句柄,仅此而已。

copy.copy根本不会改变这一点。

如果你想传播数字或字符串的变化 - 这里是不变性显示 - 你必须将数字和字符串包装在另一个对象中并将其分配给ab。 / p>

如果你想反过来,你必须使用copy模块,但一定要阅读文档。但你必须考虑对象变量。