注:其实这些小细节正体现了Python的性质——它是一门面向对象的编程语言
下面通过具体的代码来配合讲解与说明:
一.
a=[0]
b=[1,2]
a.append(b)
b.append(3)
print(a)#输出[0, [1, 2, 3]]
说明a.append(b)中的append()函数不是将(参数)b复制到a中,而是将引用b传递到a中(为其指向的对象再创建引用),这也就使得后面再操作b时,先前append到a中的b也会受影响(这不就体现了Python是一门面向对象的编程语言了吗)
二.
a=[0]
b=[1,2]
c=[3]
c=b
print(c)#输出[1, 2]
a.append(c)
b.append(3)
print(a)#输出[0, [1, 2, 3]]
让引用c指向引用b指向的对象所以才会导致b变c就会变,c变那么之前append到a中的c也会变。(c=b)这个操作进行之后print(c)输出[1,2],那么也就说明了:当执行“变量1=变量2”是让变量1指向变量2所指向的对象
三.
class cla:
def __init__(self,a):
self.a=a
list_1=[0]
list_2=[1]
c=cla(list_1)
d=cla(list_2)
c=d
list_2.append(7)
print(list_1)#输出为[0]
print(d.a)#输出为[1,7]
print(c.a)#输出为[1,7]
c.a.append(9)
list_2.append(10)
print(list_1)#输出为[0]
print(list_2)#输出为[1,7,9,10]
print(c.a)#输出为[1,7,9,10]
起初,c和d都分别指向一个cla类的对象,“c=d”创建了一个引用c指向d指向的对象,原来c指向的对象的引用数为0,于是,原来指向的对象也就被销毁了,那么下文中的c.a和d.a其实也就没了区别,也没办法通过其他的引用来改变list_1的值了,因为此时list_1所指向的对象就只剩下了list_1这一个引用了。
四.
a=[0]
b=[1]
a=b
print(a)#输出[1]
b=11
print(a)#输出[1]
b=[0]
b.append(1)
print(a)#输出[1]
print(b)#输出[0,1]
在前面所说的基础上,“a=b”表示引用a指向引用b指向的对象,那么a指向的对象的引用为0了,对象也就被销毁了,这也就说明了:输出的a却不是[0]了。当后面对b进行操作时(b=11),输出的a却不是11是因为:b原来指向的是虽然是可变对象,“b=11”是对b进行赋值操作(改变它指向的对象的值与类型),所以实际上是重新开辟了一块存储区域,建立了一个新的引用“b”,从而到值变量名(引用)a和变量名(引用)b又脱离了关系
五.
a=9
b=a
del a
print(b)#输出为9
这段代码说明了:del a不是销毁a指向的对象,而是销毁引用a。
Python变量赋值时的引用传递问题——这篇博客也是对这个问题的讲解,感兴趣可以看看。