b = a 与 b = a[:] 在字符串|列表中的区别
在 列表
中 -
我可以随时检查 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=a
让 b
指向同一个对象,而 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 会对(至少大部分)字符串进行“内部处理”,这样就不会浪费内存去存储同样的字符串多次。更重要的是,它可以通过比较固定长度的指针来比较字符串,而不是逐字节比较字符串。