以下代码:
#!/usr/bin/python
def func(listtt):
a.reverse()
a = [1, 2, 3]
b = a
print a, b
func(a)
print a, b
a = [1, 2, 3]
b = a + []
print a, b
func(a)
print a, b
产生输出:
[1, 2, 3] [1, 2, 3]
[3, 2, 1] [3, 2, 1]
[1, 2, 3] [1, 2, 3]
[3, 2, 1] [1, 2, 3]
据我所知,在第一个例子中,a和b都指向同一个列表。我的问题是如何创建一个新的相同列表对象?如果我有一个列表,b = a + []是创建两个单独但相同的列表实例的最佳方法吗?我想创建两个变量,指向两个具有完全相同值的不同列表/对象。我该怎么做?
此外,我如何知道哪些操作创建新列表以及哪些操作更改当前列表?我知道追加更改列表并添加两个列表并创建一个新列表。我在https://docs.python.org/3.4/library/stdtypes.html#mutable-sequence-types中找到了可能的操作列表,但哪些操作可以执行哪些操作?
答案 0 :(得分:3)
获取列表的浅表副本:
b = a[:] # There are various other options such as list(a), copy.copy(a) etc.
a
和b
现在相同,但不要指向相同的参考。
就地修改列表的方法是list
的方法,例如.sort()
。您知道,如果使用=
运算符完成了新值,则会分配新值。
答案 1 :(得分:2)
要复制或克隆列表有很多东西: -
您可以对其进行切片:
new_list = old_list [:]
Alex Martelli's关于这一点的观点(至少在2007年),它是一种奇怪的语法,并且永远无法使用它。 ;)(在他看来,下一个更具可读性。)
您可以使用内置的
list()
功能:new_list = list(old_list)
您可以使用通用
copy.copy()
:import copy new_list = copy.copy(old_list)
这比list()慢一点,因为它必须首先找出old_list的数据类型。
如果列表包含对象,并且您也想要复制它们,请使用泛型
copy.deepcopy()
:import copy new_list = copy.deepcopy(old_list)
显然是最慢和最需要记忆的方法,但有时是不可避免的。
有关详细信息,请查看此answer。