python何时使用copy.copy

cap*_*oke 9 python

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

>>>a=5
>>>b=a
>>>a=6
>>>print b
5
Run Code Online (Sandbox Code Playgroud)

好有意义.但在什么情况下说b=aa和b之间形成某种"链接",以便修改a会修改b?这是我没有得到的copy.copy- 每次使用等号将一个变量分配给另一个变量时,只需复制该值吗?

agf*_*agf 25

基本上,b = a指向b任何地方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]
Run Code Online (Sandbox Code Playgroud)

他们两个仍然指向同一个项目.

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

>>>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
Run Code Online (Sandbox Code Playgroud)

通过这样做,你总能看到内存中指向的东西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
Run Code Online (Sandbox Code Playgroud)

copy想要制作结构的副本时使用.但是,它仍然不会复制被拘禁的东西.这包括小于整数256,True,False,None,短字符串喜欢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
Run Code Online (Sandbox Code Playgroud)

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