我对切片操作感到困惑。
>>> s = "hello world"
>>> y = s[::]
>>> id(s)
4507906480
>>> id(y)
4507906480 # they are the same - no new object was created
>>> z = s[:2]
>>> z
'he'
>>> id(z)
4507835488 # z is a new object
Run Code Online (Sandbox Code Playgroud)
切片操作遵循什么分配规则?
对于大多数内置类型,切片始终是浅拷贝……从某种意义上说,修改副本不会修改原始类型。这意味着对于不可变类型,对象算作自身的副本。该copy
模块还使用了这个“复制”的概念:
>>> t = (1, 2, 3)
>>> copy.copy(t) is t
True
Run Code Online (Sandbox Code Playgroud)
对象可以自由使用它们选择的任何分配策略,只要它们实现了它们所记录的语义。y
可以是与 相同的对象s
,但z
不能,因为s
和z
存储不同的值。