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)
;显式比隐式好,而且[:]
技巧几乎不能概括。