在python中对一个变量(变量名)赋值前,变量的作用仅仅是一个标识符,只有赋值后(建立了指向对象的引用)才被创建。"赋值"后的变量指向响应的对象,类型属于对象,不再是变量。
变量引用对象有两种引用方式:一般引用和共享引用。
一般引用
x = 1 x = 'abc'
上述代码中数值1和字符串“abc”分别是两种对象,初始变量名x赋值对象1被创建,变量名x指向对象1的内存空间,之后变量名x又指向了字符串"abc"的内存空间。
共享引用
共享引用即多个变量名指向同一个对象,当修改其中一个变量(即修改该变量指向的对象)时,由于引用同一个对象,所以其他变量也会受到影响。如下代码所示
In: a = [1,2,3] # a指向对象[1, 2, 3] b = a # b指向a引用的对象[1,2,3] In: b out:[1,2,3] In: a[1] = 99 In: a out: [1,99,3] In: b out: [1,99,3] In: b.append('qq') out: [1,99,3,'qq'] In: a out: [1,99,3,'qq']
在给一个变量名赋值后,修改该变量名时,如何防止原始也被修改?使用copy.deepcopy() 操作替换引用操作,即为变量名创建一个新的对象,使变量名引用到新的对象,这样共享引用就变成了一般引用。方法如下
import copy a = [1,2,3] b=copy.deepcopy(a) #变量名b引用吃用copy创建的一个和[1,2,3]对象数值一样,内存位置不一样的新的 对象。 In: b.pop(0) In: b out: [2,3] In: a out: [1,2,3]
注意:以下代码中变量名a和变量名b引用的是两个不同的对象,[1, 2, 3]和[1],不是共享引用,因为引用的是两个不同对象,所以修改时不会相互影响。
a = [1, 2, 3] b = a[0] In: b.append(4) out:[1,4] In: a out:[1,2,3] In: a[0] = 9 a out: [9, 2, 3] In: b out:[1, 4]