Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。
1.append()函数的基本用法
append()函数可以在列表末尾添加任意类型的元素
1.1 添加整数、浮点数、字符串
实例:
list1 = [1, 2]
list1.append(0) #添加整数类型
print('list1=', list1)
list2 = [1, 2]
list2.append(1.23) #添加浮点数类型
print('list2=', list2)
list3 = [1, 2]
list3.append('everything') #添加字符串类型
print('list3=', list3)
输出:
list1= [1, 2, 0]
list2= [1, 2, 1.23]
list3= [1, 2, 'everything']
1.2 添加列表、字典
实例:
list1 = [1, 2]
a = [1, 2, 3] #列表
list1.append(a)
print('list1=', list1)
list2 = [1, 2]
b = {'小明': 1, '小虎': 2} #字典
list2.append(b)
print('list2=', list2)
输出:
list1= [1, 2, [1, 2, 3]]
list2= [1, 2, {'小明': 1, '小虎': 2}]
2.添加列表发生的同步变化问题
2.1列表、字典同步变化
实例:列表变化
name_list = ['sam', 'dean']
number_list = [1, 2, 3]
name_list.append(number_list)
print(number_list)
print(name_list)
a = 4
number_list.append(a)
print(number_list)
print(name_list)
输出:
[1, 2, 3]
['sam', 'dean', [1, 2, 3]]
[1, 2, 3, 4]
['sam', 'dean', [1, 2, 3, 4]] #结果中的number_list同步变化
2.2 运行原理
为什么已经被添加的列表或字典发生变化时,结果中的列表或字典也同步变化,这是由于append()函数的工作原理是直接调用元素的地址。
实例1:列表变化
name_list = ['sam', 'dean']
number_list = [1, 2, 3]
name_list.append(number_list)
print(id(number_list)) #number_list的引用地址
print(id(name_list[2])) #添加后的引用地址
输出:
2926810333248
2926810333248
实例2:字典变化
name_list = ['sam', 'dean']
number_list = {'a': 1, 'b': 2, }
name_list.append(number_list)
print(name_list)
print(id(name_list[2]))
print(id(number_list))
number_list['a'] = 3
print(number_list)
print(name_list)
输出:
['sam', 'dean', {'a': 1, 'b': 2}]
1986756347904
1986756347904
{'a': 3, 'b': 2}
['sam', 'dean', {'a': 3, 'b': 2}]
可以看出,添加后number_list的引用地址和原来相同,意味着如果原本number_list中值发生变化,则name_list中添加的number_list值同步变化,这在后续工作中可能出现问题。
2.3 解决方案
我们可以将append()函数引用地址的功能改成引用内容,这需要用到copy()函数。
这里要提到拷贝的两种概念:
1.浅拷贝:拷贝对象的引用地址
2.深拷贝:拷贝对象的内容
而copy()函数中的copy.deepcopy()可以直接拷贝列表的内容,这样就可以保证添加的列表值不发生改变。
实例1:列表
import copy
name_list = ['sam', 'dean']
number_list = [1, 2, 3]
name_list.append(copy.deepcopy(number_list)) #直接拷贝number_list的内容
print(number_list)
print(name_list)
print(id(number_list))
print(id(name_list[2])) #查看此时被添加到name_list中number_list的地址
a = 4
number_list.append(a)
print(number_list)
print(name_list)
输出:
[1, 2, 3]
['sam', 'dean', [1, 2, 3]]
2182206779456
2182206779392
[1, 2, 3, 4]
['sam', 'dean', [1, 2, 3]]
实例2:字典
import copy
name_list = ['sam', 'dean']
number_list = {'a': 1, 'b': 2, }
name_list.append(copy.deepcopy(number_list))
print(name_list)
print(id(name_list[2]))
print(id(number_list))
number_list['a'] = 3
print(number_list)
print(name_list)
输出:
['sam', 'dean', {'a': 1, 'b': 2}]
2607266300864
2607266269184
{'a': 3, 'b': 2}
['sam', 'dean', {'a': 1, 'b': 2}]
可以看到,经过深度拷贝后的列表字典的地址已经改变改变且列表值不随原列表同步变化。
3. extend()函数的基本用法
extend()函数也是添加元素,但与append()函数的区别在于,当添加列表或字典时,extend()函数直接添加列表或字典中的元素,而append()函数则是将列表或字典当作一个元素直接添加。
实例:
list1 = [1, 2]
a = [1, 2, 3]
list1.extend(a)
print(list1)
list2 = ['sam', 'dean']
b = {'dd': 1, 'mm': 2}
list2.extend(b)
print(list2)
输出:
[1, 2, 1, 2, 3]
['sam', 'dean', 'dd', 'mm'] #字典中的元素值不显示
需要注意,利用attend()添加字典中元素时,元素的值不显示。
Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。Python中内置函数append()、extend()的用法及区别 本文讲述了append()函数与extend函数的用法及区别,并介绍了浅拷贝引用地址导致数值同步的解决方法。