小能豆

python 按值列出而不是按引用列出

javascript

让我们举个例子

a=['help', 'copyright', 'credits', 'license']
b=a
b.append('XYZ')
b
['help', 'copyright', 'credits', 'license', 'XYZ']
a
['help', 'copyright', 'credits', 'license', 'XYZ']

我想在列表“b”中附加值,但列表“a”的值也发生了变化。
我想我不太明白为什么会这样(python 通过引用传递列表)。
我的问题是“我如何通过值传递它,以便附加“b”不会改变“a”中的值?”


阅读 58

收藏
2024-07-10

共1个答案

小能豆

在 Python 中,当你将一个列表赋值给另一个变量时,这两个变量实际上指向同一个列表对象。因此,对其中一个变量进行修改会影响到另一个变量。

要实现你所说的“通过值传递”,你需要创建列表的副本。可以通过几种方法来创建副本,以确保修改副本不会影响原始列表:

  1. 使用切片操作符创建副本:
a = ['help', 'copyright', 'credits', 'license']
b = a[:]
b.append('XYZ')
print(b)  # ['help', 'copyright', 'credits', 'license', 'XYZ']
print(a)  # ['help', 'copyright', 'credits', 'license']
  1. 使用 list() 构造函数创建副本:
a = ['help', 'copyright', 'credits', 'license']
b = list(a)
b.append('XYZ')
print(b)  # ['help', 'copyright', 'credits', 'license', 'XYZ']
print(a)  # ['help', 'copyright', 'credits', 'license']
  1. 使用 copy() 方法创建副本(Python 3.3+):
a = ['help', 'copyright', 'credits', 'license']
b = a.copy()
b.append('XYZ')
print(b)  # ['help', 'copyright', 'credits', 'license', 'XYZ']
print(a)  # ['help', 'copyright', 'credits', 'license']
  1. 使用 copy 模块中的 copy() 函数:
import copy
a = ['help', 'copyright', 'credits', 'license']
b = copy.copy(a)
b.append('XYZ')
print(b)  # ['help', 'copyright', 'credits', 'license', 'XYZ']
print(a)  # ['help', 'copyright', 'credits', 'license']

如果你的列表包含可变对象(例如,列表的列表),并且你希望避免任何对嵌套对象的更改,那么你应该使用深复制:

  1. 使用 copy.deepcopy() 函数:
import copy
a = [['help'], ['copyright'], ['credits'], ['license']]
b = copy.deepcopy(a)
b[0].append('XYZ')
print(b)  # [['help', 'XYZ'], ['copyright'], ['credits'], ['license']]
print(a)  # [['help'], ['copyright'], ['credits'], ['license']]

根据你的需求选择合适的方法,如果只需要对列表进行浅复制,前三种方法就足够了。如果需要对包含可变对象的列表进行深复制,使用 copy.deepcopy() 是最好的选择。

2024-07-10