python赋值语句对错_如何理解这一句 Python 的赋值语句?

15

2016-08-23 06:40:50 +08:00 heart_neue_red.png?v=16ec2dd0a880be6edda1e4a2e35754b3 6

这个算是新手的常见问题吧,我上个礼拜刚给别人解答过。把上次写的直接粘贴复制过来。

>>>>

我补充一下, list 的乘法是浅拷贝,只是复制存储的 PyObject*指针,

所以 a = [[]]*2 ,如果 a[0].append(3), 就会得到[[3], [3]] 而不是[[3], []]

至于为什么这种效果,没办法,人家就是这样设计的,参见

https://hg.python.org/cpython/file/8f84942a0e40/Objects/abstract.c#l928

上面会调用 list 的 sq_repeat , 也就是在这里,

https://hg.python.org/cpython/file/db93af6080e7/Objects/listobject.c#l539

你看,它只是复制了指针。

其实我想补充的是,

对于 python 的多维数组,请不要这样写,

[[0 for i in xrange(4)] for j in xrange(4)],

既然 0 是 immutable ,你完全可以这样写

[[0]*4 for j in xrange(4)]

但是,注意到你都用不到 j 这个变量,我发现你用的是 python2, 在 python2 里, list comprehension 没有新开栈帧,用的是当前函数(或者 module,本质上是 PyFrame)的 local namespace, 换句话说,你这个 j 除了污染当前函数的 local 名字空间以外,别无是处。

建议这样写,

[[0]*4 for _ in xrange(4)]

当然,在 Python3 里, list comphrension 会在一个新的 frame 里执行,不会存在名字空间的污染,不过还是推荐写成_, 因为你根本用不到 j 这个变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值