Python 浅赋值和深赋值

is 这个操作符。它和 == 的区别在于:== 只判断“值”是不是相等,而 is 则判断是否为同一个对象,也就是地址一致。


可变对象 包括 list、dict、set、自定义类型 等; 
不可变对象 包括 int、float、bool、str、tuple 等。

不可变对象可以作为字典 dict 的键 key ,而可变对象不行。比如 list 不能作为字典的键,但 tuple 可以。

Python 中的变量不是装有对象的“ 容器 ”,而是贴在对象上的“ 标签 ”。


m = m + 和 m += 虽然是一样的结果,但 m 指向的对象却发生了变化。原因在于,前者是做了赋值操作,而后者其实是调用的 __iadd__ 方法。

在 python 中赋值语句总是建立对象的引用值,而不是复制对象。

在函数内部对参数的修改是否会影响到外部变量的值,取决于你怎样修改:如果是重新赋值就不会,如果是修改对象自身内容则会。

如果你想要通过一个函数来修改外部变量的值,有几种方法:

通过返回值赋值
使用全局变量
修改 list 或 dict 对象的内部元素
修改类的成员变量

如果我们就是需要产生一个 list 对象的副本,可以通过 [:]
values[:] #生成对象的拷贝或者是复制序列,不再是引用和共享变量,但此法只能顶层复制
values[:] 复制操作是所谓的「浅复制」(shallow copy)
正确的复制嵌套元素的方法是进行「深复制」(deep copy)
b = copy.deepcopy(a)

例:
执行 values[1] = values 的时候,Python 做的事情则是把 values 这个标签所引用的列表对象的第二个元素指向 values 所引用的列表对象本身。执行完毕后,values 标签还是指向原来那个对象,只不过那个对象的结构发生了变化,从之前的列表 [0, 1, 2] 变成了 [0, ?, 2],而这个 ? 则是指向那个对象本身的一个引用


引用 VS 拷贝:
没有限制条件的分片表达式(L[:])能够复制序列,但此法只能浅层复制。
字典 copy 方法,D.copy() 能够复制字典,但此法只能浅层复制
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值