b = a 与 b = a[:] 在字符串|列表中的区别

1 投票
2 回答
585 浏览
提问于 2025-04-16 02:40

列表 中 -

我可以随时检查 b=a 是否指向同一个对象,而 c=a[:] 则是创建了另一个副本。

>>> a = [1,2,3,4,5]
>>> b = a
>>> c = a[:]
>>> a[0] = 10
>>> b
[10, 2, 3, 4, 5]
>>> c
[1, 2, 3, 4, 5]

字符串 中 -

我不能对原始的不可变字符串进行修改。我该如何确认 b=ab 指向同一个对象,而 c = a[:] 创建了一个新的字符串副本呢?

2 个回答

1

同样的字符串可以存储在多个地方,这种情况是可能发生的 - 看看这个例子。

>>> a="aaaaa"
>>> b=a[:]
>>> b is a
True
>>> b=a[:-1]+a[-1]
>>> b is a
False
>>> b==a
True
>>> 
2

你可以使用 is 操作符。

a = 'aaaaa'
b = 'bbbbb'

print a is b
a = b
print a is b

c = a[:]
print c is a

这个操作符的工作原理是:只有当 a is b 时,才会成立 id(a) == id(b)。至少在 CPython 中,id(foo) 实际上就是存储 foo 的内存地址。因此,如果 foo is bar,那么 foo 和 bar 其实是同一个对象。有趣的是,

a = 'aaaaa'
b = 'aaaaa'
a is b

True。这是因为 Python 会对(至少大部分)字符串进行“内部处理”,这样就不会浪费内存去存储同样的字符串多次。更重要的是,它可以通过比较固定长度的指针来比较字符串,而不是逐字节比较字符串。

撰写回答