gpt4 book ai didi

Python切片[:] inconsistent behavior

转载 作者:行者123 更新时间:2023-11-30 22:00:15 28 4
gpt4 key购买 nike

在 Python 中,为什么 [:] 切片操作的行为不一致?
它对于列表和字符串的行为有所不同。

对于列表,它给出一个副本列表对象,对于字符串,它给出相同的字符串对象。

我觉得这令人困惑,违反直觉。有什么办法可以解释/证明这一点吗?

    >>> s = "1234"
>>> s is (s[:2] + s[2:])
False
>>> s is s[:]
True
>>> lst = [1,2,3,4]
>>> lst is lst[:]
False
>>> lst is (lst[:2] + lst[2:])
False

我发现这部分令人困惑。我希望它返回False

>>> s is s[:]
True

此外,我希望这两个返回相同的结果False,但事实并非如此。

>>> s is (s[:2] + s[2:])
False
>>> s is s[:]
True

有什么想法吗?

最佳答案

对于大多数内置类型,Python 会尝试确保切片的(浅)突变不会影响切片所属的对象。

对于列表,这需要一个副本,否则改变 l[:] 会改变 l

对于字符串,字符串不支持突变,因此“突变 s[:] 不会影响 s” 之类的语句是空洞的,即使 s[:] 是 s。不需要创建副本,因此为了节省时间和内存,实现不会创建副本。这是一个实现细节,而不是语言保证;对于实现来说复制是完全有效的。

(您可能认为涉及驻留,但事实并非如此。此对象重用优化与驻留完全无关。即使对于非驻留字符串也会发生。如果需要,您可以查看 the implementation 。)

<小时/>

一般来说,如果您的程序关心不可变对象(immutable对象)的身份,那么您可能做错了什么。对象标识对于可变对象很重要,Python 确保可变对象的标识是可预测的。对于不可变对象(immutable对象),对象身份无关紧要,Python 应用了许多对象重用实现,这些实现打破了许多关于对象身份的乐观假设。

关于Python切片[:] inconsistent behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357060/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com