python思辨:潜复制

在学习基本数据类型时,学习到了"潜复制",后来,又学习到了"可变对象",为了理清潜复制对可变对象的影响,进行了下面代码尝试,发现越尝试理清楚,起容易糊涂。后经老师及时纠偏,学会适可而止,才没越陷越深。
此经历分享出来,希望在编程的道路上,大家要有锲而不舍的精神,也要有壮士断腕的决心,选择好道路,不忘初心,适当放弃路途上的风景,确实需要再回头细研究。祝您在编程的道路上向着目标,飞驰前行!

a =[ {"key1":[1,2,3,4]},[100,200],"python",20,(4,5,6)]
b = a.copy()
c= b.copy()
print("-----------------变化前-----------------")
print("a=",a)
print("b=",b)
print("c=",c)

print("id(a)=",id(a))
print("id(b)=",id(b))
print("id(c)=",id(c))

print("id(a[0])=",id(a[0]),"id(a[1])=",id(a[1]),"id(a[2])=",id(a[2]),"id(a[3])=",id(a[3]))
print("id(b[0])=",id(b[0]),"id(b[1])=",id(b[1]),"id(b[2])=",id(b[2]),"id(b[3])=",id(b[3]))
print("id(c[0])=",id(c[0]),"id(c[1])=",id(c[1]),"id(c[2])=",id(c[2]),"id(c[3])=",id(c[3]))

b[0]["key2"]="新增的key_value"    # 对变量b[0] 增加一个key_value
c[1]=(500,800)                    # 将变量c[1]换成一个元组
a[1]*=2                           # 将变量a[1]自身复制一次,id 和值都不变
b[1]= a[1]                        # 将变量[1]赋值给 b[1] ,id 和值都不变
b[1]= a[1]*2                      # 将变量[1]赋值给 b[1] ,变量b[1]的id 和值都变了
b[2]="java"                       # id 和值都变了

print("-----------------变化后-----------------")
print("a=",a)
print("b=",b)
print("c=",c)

print("id(a)=",id(a))
print("id(b)=",id(b))
print("id(c)=",id(c))

print("id(a[0])=",id(a[0]),"id(a[1])=",id(a[1]),"id(a[2])=",id(a[2]),"id(a[3])=",id(a[3]))
print("id(b[0])=",id(b[0]),"id(b[1])=",id(b[1]),"id(b[2])=",id(b[2]),"id(b[3])=",id(b[3]))
print("id(c[0])=",id(c[0]),"id(c[1])=",id(c[1]),"id(c[2])=",id(c[2]),"id(c[3])=",id(c[3]))


a =[1,2,3]
b =a
c =b
c=2*b

print(a,b,c)


a = [1,2,3]
b= a
c=b
d=c
a*=2
b=a*2

print(a)
print(b)
print(c)
print(d)

感谢逻辑教育Jerry老师解惑:
以下是老师回复原话:
首先老师先和你明确一个方向,学习编程切勿进入思维怪圈

第一个问题 潜复制

其实这个问题老师只是用字典给同学们举例子而已。在这个例子当中。我们先理解复制。复制就是 二者没有丝毫的关系。我改其中一个不影响另一个 那么复制的基础上 在说这个 “”潜“” 字。我们发现有一种特殊情形就是 在可变序列中(字典列表原理一样) 就是它里面在嵌套一个可变序列的时候。这个时候你修改 嵌套里面的可变序列我们发现修改一个另一个也会被修改。这就证明了,这种复制并没有像我们刚才说的,修改一个不影响另一个。这就是一个 潜复制。可以简单理解只是复制了 第一层。里面的内容没有复制到,也就是说 改一个另外的一个也会跟着去改。当然做这些前提都是在可变序列中去操作,不可变序列操作没有意义。

所以 总结一下,这个问题上面不用太纠结。知道这种操作就可以。在以后的书写中记住即可

第二个 问题 关于可变对象

其实 这个问题就更简单了

先从对象的三要素来说 id type value 改变对象就是可以改变对象里面的值 value,例如 列表

不可变对象就是说对象里面的值不能改变 例如 元组

当然还有一种操作 是赋值动作,这个赋值动作无论是可变还是不可变都可以修改值,但是这个你要清楚,我重新赋值了,也就意味这在内存中重新开辟了一个区域,那也就是有一个新的对象指向这个区域,所有 赋值不但该了对象的value,也该了对象的id。

其实 就是这样。如果还是有问题的话,只能多看几遍视频,或者找一些帖子,自己在理解理解。还是那句话切勿进入思维怪圈。这样学编程的大忌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值