Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting - Fatal编程技术网

Python 为什么';这不是分配副本吗

Python 为什么';这不是分配副本吗,python,sorting,Python,Sorting,我有以下代码,我想知道为什么它返回相同的列表而不是副本: x = [2,1,3] y = x y.sort() print y print x 为什么会返回相同的排序列表?,因为它已被就地修改 Python列表具有引用语义,这意味着当您将一个列表分配给另一个变量时,它们实际上指向同一个列表 如果要制作副本,请执行以下操作: x = [2,1,3] y = x[:] y.sort() print y print x y = x[:] 切片表示法确实会导致复制列表(在本例中,是整个列表,尽管您

我有以下代码,我想知道为什么它返回相同的列表而不是副本:

x = [2,1,3]
y = x
y.sort()
print y
print x

为什么会返回相同的排序列表?

,因为它已被就地修改

Python列表具有引用语义,这意味着当您将一个列表分配给另一个变量时,它们实际上指向同一个列表

如果要制作副本,请执行以下操作:

x = [2,1,3]
y = x[:]
y.sort()
print y
print x
y = x[:]

切片表示法确实会导致复制列表(在本例中,是整个列表,尽管您可以进行一些小的修改以请求特定的子列表)。

,因为它已被就地修改

Python列表具有引用语义,这意味着当您将一个列表分配给另一个变量时,它们实际上指向同一个列表

如果要制作副本,请执行以下操作:

x = [2,1,3]
y = x[:]
y.sort()
print y
print x
y = x[:]

切片表示法确实会导致复制列表(在本例中,是整个列表,不过您可以进行一些小的修改以请求特定的子列表)。

在Python中将列表分配给另一个变量会创建一个引用,因此对引用所做的任何更改都将显示在原始列表中。如果您想要一份不会改变原件的副本,请执行以下操作:

x = [2,1,3]
y = x[:]
y.sort()
print y
print x
y = x[:]

在Python中,将列表分配给另一个变量会创建一个引用,因此对引用所做的任何更改都将显示在原始变量中。如果您想要一份不会改变原件的副本,请执行以下操作:

x = [2,1,3]
y = x[:]
y.sort()
print y
print x
y = x[:]
您正在处理Python中的引用。语句
y=x
使
y
指向与
x
相同的东西,因此对
y
的更改反映在
x
中(因为它们指向相同的基础列表)

您可以通过执行以下操作更改副本:

y = list(x) # make a copy of the list so we can change y without disturbing x
y.sort()

您正在处理Python中的引用。语句
y=x
使
y
指向与
x
相同的东西,因此对
y
的更改反映在
x
中(因为它们指向相同的基础列表)

您可以通过执行以下操作更改副本:

y = list(x) # make a copy of the list so we can change y without disturbing x
y.sort()


因为您只复制引用

有关如何克隆列表(“深度复制”)的说明,请参阅:

因为您只复制引用

有关如何克隆列表(“深度复制”)的说明,请参阅:

当你说
y=x
时,你实际上只是给x的内容指定了另一个名称(y)。如果x是一个可变值,并且您做了一些更改,那么您将更改一个也是唯一一个具有两个不同名称的副本

防止这种情况发生的一种常见方法是指定一个切片,该切片始终是原始列表的副本

y = x[:]

当你说
y=x
时,你实际上只是给x的内容指定了另一个名称(y)。如果x是一个可变值,并且您做了一些更改,那么您将更改一个也是唯一一个具有两个不同名称的副本

防止这种情况发生的一种常见方法是指定一个切片,该切片始终是原始列表的副本

y = x[:]
x是列表(对象)的名称(“引用”)。线路

y=x
只是让y为同一个列表取另一个名字。如果要复制列表,请使用以下选项之一:

y = x[:]
y = list(x)
(第一种语法只是一个普通的列表片段,但同时省略了起始值和结束值,这意味着它将占用整个列表。)

请注意,列表是对象的列表,复制列表不会复制对象。如果你想要这种行为——深度复制——你必须用

import copy
y = copy.deepcopy(x)
当然,这会更慢。

x是列表(对象)的名称(“引用”)。线路

y=x
只是让y为同一个列表取另一个名字。如果要复制列表,请使用以下选项之一:

y = x[:]
y = list(x)
(第一种语法只是一个普通的列表片段,但同时省略了起始值和结束值,这意味着它将占用整个列表。)

请注意,列表是对象的列表,复制列表不会复制对象。如果你想要这种行为——深度复制——你必须用

import copy
y = copy.deepcopy(x)

当然,这会更慢。

“为什么它返回相同的列表”?因为这是
=
的规则。我不清楚你在问什么?您是在询问
=
的Python定义吗?“为什么它返回相同的列表”?因为这是
=
的规则。我不清楚你在问什么?你是在问Python对
=
的定义吗?Python中的所有东西都有引用语义,除非你刻意使用伪值语义。嗯……你是对的。数字似乎具有值语义,因为它们是不可变的。好的,我将删除这个冒犯性的句子。数字似乎只有值语义;当您说
a=a+b
时,您正在创建一个新的数字作为总和,并将名称
a
重新分配给该总和。
a
的旧内容仍在内存中,等待垃圾回收。马克:是的,这就是我在你上面的评论中提到的内容。正如我所说,更正了。等等,那么当你说
x=1\ny=x\nx=2
时会发生什么呢?Python中的所有东西都有引用语义,除非你特意去伪值语义。嗯……你是对的。数字似乎具有值语义,因为它们是不可变的。好的,我将删除这个冒犯性的句子。数字似乎只有值语义;当您说
a=a+b
时,您正在创建一个新的数字作为总和,并将名称
a
重新分配给该总和。
a
的旧内容仍在内存中,等待垃圾回收。马克:是的,这就是我在你上面的评论中提到的内容。正如我所说,更正了。等等,那么当你说
x=1\ny=x\nx=2
时发生了什么?我更喜欢
list(x)
;显式比隐式好,而且
[:]
技巧也不能很好地概括。@Karl:
[:]
是显式的,只是对于不精通该语言习惯用法的人来说不太明显。我更喜欢
列表(x)
;显式比隐式好,而且
[:]
技巧几乎不能概括。