Python 中列表可变性的混淆
Confusion over mutability of lists in Python
我试图对 Python 中列表的可变性如何工作有更多的直觉。特别是,我对 this source:
中的声明感到困惑
If you need to sort a list, either alphabetically or numerically, Python has you covered there as well. Just call the sort() method on the list, and it will be saved in the new order. This will overwrite the previous list, so create a copy to sort, if you need to preserve the original.
我不确定我是否理解如何实现粗体部分。这是我正在谈论的示例:
>>> x = [3,2,1,0]
>>> y = x
>>> x
[3,2,1,0]
>>> y
[3,2,1,0]
>>> y.sort()
>>> y
[0,1,2,3]
>>> x
[0,1,2,3]
所以我创建了一个副本进行排序,然后对副本进行排序,但是这改变了原来的列表。因此,我对上面引述的意思感到困惑。我不明白这是怎么回事 "preserves the original"。有什么特殊的复制方法吗?谢谢
使用y = list(x)
创建一个新列表。否则,您只会获得对同一列表对象的新引用。
你复制了x的引用
你可以试试deepcopy找点乐子
import copy
x = [3,2,1,0]
y = copy.deepcopy(x)
y.sort()
print x
你应该想到这些说法
x = [3,2,1,0]
y = x
将 x 指向的列表对象的引用复制到 y。
由于两个变量都是对同一对象的引用,因此对 y 进行排序会导致对 x 和 y 指向的对象进行排序。
要实现您想要的行为,使用创建列表的排序副本的函数会更容易
y = sorted(x)
或者如文档所述,首先创建一个副本并对副本进行就地排序
y = x[:]
y.sort()
y = list(x)
y.sort()
当您说y = x
时,您不仅仅是将x
中的数据复制到y
;您正在将名称 y
分配给 x
指向的相同基础数据。也就是说,您只是生成了另一个名称 y
,通过它来引用已被 x
引用的数据。因此,当您调用 y.sort()
时,您也无意中对 x
进行了排序,因为它们引用了相同的基础数据。
可以复制x
引用的数据,用y = list(x)
或y = x[:]
引用名字为y
的副本,然后排序y
不会影响 x
因为它们是真正不同的对象。或者,您可以使用非变异排序函数:x_sorted = sorted(x)
.
你应该看看什么是shallow copy
和deep copy
。那应该能够为您提供为什么您的复制方式不起作用的解决方案。
参考:https://docs.python.org/2/library/copy.html
因此,当您说 y = x
时,这意味着您正在复制引用。但不完全是用不同的引用创建另一个列表。
y = copy.deepcopy(x)
是深拷贝,会为y.
创建另一个引用所以修改y
不会改变x.
中的任何值
我试图对 Python 中列表的可变性如何工作有更多的直觉。特别是,我对 this source:
中的声明感到困惑If you need to sort a list, either alphabetically or numerically, Python has you covered there as well. Just call the sort() method on the list, and it will be saved in the new order. This will overwrite the previous list, so create a copy to sort, if you need to preserve the original.
我不确定我是否理解如何实现粗体部分。这是我正在谈论的示例:
>>> x = [3,2,1,0]
>>> y = x
>>> x
[3,2,1,0]
>>> y
[3,2,1,0]
>>> y.sort()
>>> y
[0,1,2,3]
>>> x
[0,1,2,3]
所以我创建了一个副本进行排序,然后对副本进行排序,但是这改变了原来的列表。因此,我对上面引述的意思感到困惑。我不明白这是怎么回事 "preserves the original"。有什么特殊的复制方法吗?谢谢
使用y = list(x)
创建一个新列表。否则,您只会获得对同一列表对象的新引用。
你复制了x的引用
你可以试试deepcopy找点乐子
import copy
x = [3,2,1,0]
y = copy.deepcopy(x)
y.sort()
print x
你应该想到这些说法
x = [3,2,1,0]
y = x
将 x 指向的列表对象的引用复制到 y。
由于两个变量都是对同一对象的引用,因此对 y 进行排序会导致对 x 和 y 指向的对象进行排序。
要实现您想要的行为,使用创建列表的排序副本的函数会更容易
y = sorted(x)
或者如文档所述,首先创建一个副本并对副本进行就地排序
y = x[:]
y.sort()
y = list(x)
y.sort()
当您说y = x
时,您不仅仅是将x
中的数据复制到y
;您正在将名称 y
分配给 x
指向的相同基础数据。也就是说,您只是生成了另一个名称 y
,通过它来引用已被 x
引用的数据。因此,当您调用 y.sort()
时,您也无意中对 x
进行了排序,因为它们引用了相同的基础数据。
可以复制x
引用的数据,用y = list(x)
或y = x[:]
引用名字为y
的副本,然后排序y
不会影响 x
因为它们是真正不同的对象。或者,您可以使用非变异排序函数:x_sorted = sorted(x)
.
你应该看看什么是shallow copy
和deep copy
。那应该能够为您提供为什么您的复制方式不起作用的解决方案。
参考:https://docs.python.org/2/library/copy.html
因此,当您说 y = x
时,这意味着您正在复制引用。但不完全是用不同的引用创建另一个列表。
y = copy.deepcopy(x)
是深拷贝,会为y.
创建另一个引用所以修改y
不会改变x.