Python list 完整替换

By | 12 12 月, 2018

今天在看上下文管理器的时候发现了一个有趣的用法,可以用于 Python 中 list 的整体内容替换。
看下面两段代码产生的输出,第一个是常用的赋值的方式:

s = [1, 2, 3]
t = [4, 5, 6]
print('origin addr of s: %s' % hex(id(s)))
print('origin addr of t: %s' % hex(id(t)))
s = t
print('origin addr of s: %s' % hex(id(s)))
print('origin addr of t: %s' % hex(id(t)))
print('now s: %s' % s)
print('now t: %s' % t)

输出如下:

origin addr of s: 0x7fc753c28320
origin addr of t: 0x7fc753c28518
now addr of s: 0x7fc753c28518
now addr of t: 0x7fc753c28518
now s: [4, 5, 6]
now t: [4, 5, 6]

可以看到,经过赋值运算后,st 都指向了原先 t 对应的内存地址,而 s 原先存放的内容会变成没有任何变量指向的可回收内存。
但这样有个问题,接下来对 t 的修改同样也会影响到 s。那如果我们只是单纯的想把 s 的内容替换成 t 的内容呢?看下面的代码:

s = [1, 2, 3]
t = [4, 5, 6]
print('origin addr of s: %s' % hex(id(s)))
print('origin addr of t: %s' % hex(id(t)))
s[:] = t
print('now addr of s: %s' % hex(id(s)))
print('now addr of t: %s' % hex(id(t)))
print('now s: %s' % s)
print('now t: %s' % t)

输出如下:

origin addr of s: 0x7f11ae01e320
origin addr of t: 0x7f11ae01e518
now addr of s: 0x7f11ae01e320
now addr of t: 0x7f11ae01e518
now s: [4, 5, 6]
now t: [4, 5, 6]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注