为什么 p[:] 在这两种情况下设计成工作方式不同?

7 浏览
0 Comments

为什么 p[:] 在这两种情况下设计成工作方式不同?

p = [1,2,3]

print(p) # [1, 2, 3]

q=p[:] # 假设进行浅拷贝

q[0]=11

print(q) #[11, 2, 3]

print(p) #[1, 2, 3]

# 上述代码证实了q不是p,而是一个独立的副本

del p[:] # 为什么这样不会创建一个副本然后删除那个副本?

print(p) # []

以上证实了p[:]在这两种情况下的行为不同。是吗?

考虑到在下面的代码中,我希望直接使用p而不是p的副本,

p[0] = 111

p[1:3] = [222, 333]

print(p) # [111, 222, 333]

我感到困惑的是

del p[:]

与p[:]一致,都是引用原始列表

但是

q=p[:]

令人困惑(对于像我这样的新手),因为在这种情况下,p[:]会生成一个新列表!

我的新手期望是

q=p[:]

应该与

q=p

相同,为什么创建者允许这种特殊行为生成一个副本呢?

0