在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]