Python中关于用变量名相互赋值的一些小细节

本文详细解释了Python中变量赋值时的引用传递机制,通过示例展示了如何影响对象和列表的共享以及引用计数。重点强调了Python作为面向对象语言的这一特性。
摘要由CSDN通过智能技术生成

        注:其实这些小细节正体现了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变量赋值时的引用传递问题——这篇博客也是对这个问题的讲解,感兴趣可以看看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值