Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 切片操作是否始终分配新对象?_Python_Slice - Fatal编程技术网

Python 切片操作是否始终分配新对象?

Python 切片操作是否始终分配新对象?,python,slice,Python,Slice,我对切片操作感到困惑 >>> 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

我对切片操作感到困惑

>>> 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

切片操作遵循什么分配规则?

对于大多数内置类型,切片始终是浅拷贝。。。从某种意义上说,修改副本不会修改原件。这意味着,对于不可变类型,对象将被视为自身的副本。也使用了“复制”的概念:


对象可以自由使用它们选择的任何分配策略,只要它们实现它们所记录的语义
y
可以是与
s
相同的对象,但
z
不能,因为
s
z
存储不同的值。

对于大多数内置类型,切片始终是浅拷贝。。。从某种意义上说,修改副本不会修改原件。这意味着,对于不可变类型,对象将被视为自身的副本。也使用了“复制”的概念:


对象可以自由使用它们选择的任何分配策略,只要它们实现它们所记录的语义
y
可以是与
s
相同的对象,但是
z
不能,因为
s
z
存储不同的值。

无论对象说它应该是什么规则。对我来说,这看起来是一个合理的优化,因为创建一个不可变对象的精确副本不能有那么多用例。@PaulPanzer是的,如果在同一个编译单元中有两个具有相同值的可证明不可变常量,编译器将进行类似的优化,而解释器将在同一子解释器中使用小字符串和小整数以及“关键字常量”进行类似的优化,就像在过程中的任何地方都没有一样。当然,Python实现和版本之间存在差异。一般来说,任何依赖两个相同或不相同的不可变值的代码都会被破坏。不管对象说它应该遵守什么规则。对我来说,这看起来是一个合理的优化,因为创建不可变对象的精确副本不能有那么多的用例。@PaulPanzer是的,如果在同一个编译单元中有两个具有相同值的可证明不可变常量,编译器将进行类似的优化,而解释器将在同一子解释器中使用小字符串和小整数以及“关键字常量”进行类似的优化,就像在过程中的任何地方都没有一样。当然,Python实现和版本之间存在差异。一般来说,任何依赖两个相同或不相同的相等不可变值的代码都会被破坏。我认为
memoryview
是内置类型中唯一的例外,但可能值得举一个更常见的例外的例子,例如numpy数组,即使它们不是内置的。这样想是否正确(字符串)实习?@Chris_Rands:有一点,因为它涉及到对象重用,但不同的是,我们没有在规范代表的中心表中查找对象。我认为
memoryview
是内置类型中唯一的例外,但可能值得举一个更常见的例外示例,比如numpy数组,尽管ey不是内置的。将其视为(字符串)实习是正确的吗?@Chris_Rands:有一点,因为它涉及对象重用,但不同的是,我们没有在规范代表的中心表中查找对象。
>>> t = (1, 2, 3)
>>> copy.copy(t) is t
True