li = [1, 2, 3]
s = li
s1 = li[:]
li[1] = [4]
li == s # True
li == s1 # False
由以上代码可以看到python对列表进行切片时是对列表进行了复制的, 那是属于深复制还是浅复制呢, 其实很好验证
li = [1, [2, 3], 4]
s = li
s1 = li[:]
li[1][0] = [5]
li == s # True
li == s1 # True
由此可以得出, python在进行列表切片时是对列表进行了浅复制。
之前一直都是使用object.copy()去进行浅复制的, 直到在看django源码时发现了如下一段:
class ManagementUtility:
"""
Encapsulate the logic of the django-admin and manage.py utilities.
"""
def __init__(self, argv=None):
self.argv = argv or sys.argv[:]
self.prog_name = os.path.basename(self.argv[0])
if self.prog_name == "__main__.py":
self.prog_name = "python -m django"
self.settings_exception = None
然后针对里面sys.argv部分就做了个猜想, 之所以不直接写sys.argv, 应该就是对它进行了浅复制。