共计 1650 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 这篇文章主要介绍了 Python 之列表的 append() 方法最容易踩的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 |
Python 列表的 append() 方法踩坑
在这之前,我一直认为 append() 只是个将一个对象添加到列表尾部的方法,但是今天之后,我对它有了一个新的认识。
一般情况下,我们都是这样使用:
list = [1,2,3]
list.append(4)
# list 列表就变成了 [1,2,3,4]
但是在后来的使用中,遇到了像下面这样的问题:
a = [1,2]
b = []
b.append(a)
print(b)
a.append(3)
print(b)
# 此时 b 的结果为 [[1,2,3]]
# 是的,你没看错,就是 [[1,2,3]]
明明两次打印之间没有对 b 进行任何操作,那么 b 为什么会发生变化,问题肯定是出在了 append 方法上。
通过一系列的资料查询,发现 append 方法是浅拷贝方法,什么是浅拷贝呢?
官方一点的解释就是:
在 Python 中,对象赋值实际上是对象的引用,当创建一个对象,然后把它赋值给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,这就是浅拷贝。
什么,你说你还没懂浅拷贝?没关系,下面还有:
a = 1
b = 1
print(id(a))
print(id(b))
# 此时你会发现,a 和 b 在内存中的地址居然是一样的
因为在 Python 中,先是生成了对象,然后才是变量对对象的引用。比如,1 是一个对象,然后 a 和 b 再分别对 1 进行引用,由于常数是不可变类型,所以 1 的内存空间是一样的,所以 a 和 b 共用一块内存空间。
形象的来解释就是:
有一个盒子,盒子里面放着 1,然后 a 和 b 对 1 进行引用的时候就是直接把 a 和 b 的标签贴到这个盒子上。
回归正题:
a = [1,2]
b = []
b.append(a)
print(b)
a.append(3)
print(b)
# 开始时 a 这个盒子等于 [1,2],b 这个盒子等于 []
# 使用 b.append(a) 相当于将盒子 a 放入盒子 b 中
# 所以再使用 a.append(3) 的时候,b 也会跟着一起改变呀!!!
Python 列表的 append 函数
append 的功能
将一个元素添加到当前列表中
append 的用法
用法:list.append(new_item)
参数:new_item:添加进列表的新的元素 (成员)
In [19]: names = ['insane']
In [20]: names.append('loafer')
In [21]: print(names)
['insane', 'loafer']
append 的注意事项
实战
每次只能添加一个变量
# coding:utf-8
books = []
print(id(books))
books.append('python')
print(books)
print(id(books))
number = 1.1
tuple_test = (1,)
dict_test = {'name': 'insane'}
books.append(number) # 每次只能加入一个变量
books.append(tuple_test)
books.append(dict_test)
print(books)
books.append('django')
books.append(1)
print(books)
print(id(books))
2029563540224
['python']
2029563540224
['python', 1.1, (1,), {'name': 'insane'}]
['python', 1.1, (1,), {'name': 'insane'}, 'django', 1]
2029563540224
Process finished with exit code 0
正文完
星哥玩云-微信公众号