1. 关于Python变量的定义

在Python中的变量必须赋值了以后才会为期分配内存,否则语法是不会检查通过的,直接输入变量w,会提示如下错误

>>> w
Traceback (most recent call last):
  File "", line 1, in
NameError: name 'w' is not defined

Python中的多变量赋值:

多个变量赋值
Python允许你同时为多个变量赋值。例如:

?

1
a = b = c = 1


以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。
您也可以为多个对象指定多个变量。例如:

?

1
a, b, c = 1, 2, "john"


以上实例,两个整型对象1和2的分配给变量a和b,字符串对象"john"分配给变量c

2.关于赋值,浅拷贝,深拷贝

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。浅拷贝的copy和深拷贝deepcopy都得进行import copy模块,分别理解两者不同:

  • 利用copy、切片操作和工厂方法list方法浅拷贝

  • 利用copy中的deepcopy方法进行深拷贝

(1)赋值

>> a=1>> b=a

python中赋值只是赋值了一个引用,a、b指向的是同一空间,a、b可以看做标签或对象,可以用内置函数发现id(a)=id(b)。

(2)浅拷贝

序列类型的可以通过三种方式实现浅拷贝,1、切片操作 2、工厂方法,例如list() 3、使用copy函数的copy方法。

>> a = [1,2,3,['a','b','c']]>> b = a[:]>> c=list(a)>> d=copy.copy(a)

它们的id,从id可以看出是不同对象

>> id(a),id(b),id(c),id(d)(41894136,41892640,41777592,41898721)

这里可以看出浅拷贝是拷贝了最外围的对象本身,内部元素拷贝的是一个引用。

(3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

>>> import copy

>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]  始终没有改变

小结:

1.浅拷贝只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。浅拷贝可以通过copy方法、切片操作,工厂方法list方法。

2.利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。

但是对于数字,字符串和其他原子类型对象等,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。

3.分片、copy这些拷贝方法都只能做顶层的复制,不能复制嵌套的数据结构。你可以用b = copy.deepcopy(a)这个方法可以完全独立的拷贝完整的数据结构。