python 序列中的可变、不可变对象与=、*操作

部署运行你感兴趣的模型镜像
可变对象与不可变对象

可变对象指的是对象的内容是可变的,而不可变的对象表示内容不可变。
常用的可变不可变对象有

  • 不可变对象:int 、string、float、tuple
  • 可变对象:list、dict

这里的可变与不可变是指在原来保存地址的基础上是否可变。

= 操作

可变对象的=操作是将等号右边的变量赋给左边,所以这两个变量指向的是同一片内存,所以只要这两个对象中的任何一个修改了内存中的变量,那么另外一个变量也会跟着改变。

test = [1,2,3]

a = test
b = test
print(id(test),id(a),id(b))
==>2843376973704 2843376973704 2843376973704
a[1] =0
print(test,a,b)
==>[1, 0, 3] [1, 0, 3] [1, 0, 3]
* 操作

python中对序列进行乘法操作表示对该序列的复制,但是*操作涉及到深浅复制。
eg1:

test = [[1]*3]*3
print(test)
test[0][0]=0
print(test)
==>
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
[[0, 1, 1], [0, 1, 1], [0, 1, 1]]

eg2:

test = [[1]*3 for i in range(3)]
print(test)
test[0][0]=0
print(test)
==>
[[1, 1, 1], [1, 1, 1], [1, 1, 1]]
[[0, 1, 1], [1, 1, 1], [1, 1, 1]]

显然,eg2才是我们想要的结果。
在使用*操作复制序列时,当序列中的元素X是不可变对象时,那么复制出的元素是神复制;如果序列中的元素X是可变对象时,那么复制出的元素是浅复制,即复制出来的序列和原序列指向同一片内存。
上面的话很重要,可以解释为什么[1]可以使用乘来复制,而[1,1,1]不可以。
如果复制的对象是可变对象中有不可变对象

要复制的序列元素包含可变与不可变元素?

这种情况下,可变元素是浅复制,不可变元素是深复制

a = [1,2,[0,0]]
b  =a*3
print(b)
b[0]=0
b[2][1] =1
print(b)
==>
[1, 2, [0, 0], 1, 2, [0, 0], 1, 2, [0, 0]]
[0, 2, [0, 1], 1, 2, [0, 1], 1, 2, [0, 1]]

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值