Python - 浅拷贝与深拷贝 - 再次整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang725/article/details/84451501
# -*- coding: UTF-8 -*-
import copy

def print_id(lst):
    lst_id = [id(y) for y in lst]
    lst_id.extend([id(y) for y in lst[1]])
    return str(lst_id)


def test_copy():
    Anndy = ['Anndy', ['age', 24]]
    Tom = Anndy[:]
    Cindy = list(Anndy)

    # 打印Anndy, Tom, Cindy容器元素的id
    print "Anndy: " + str(Anndy)
    print "Tom: " + str(Tom)
    print "Cindy: " + str(Cindy)
    print 'Anndy id: ' + print_id(Anndy)
    print 'Tom id: ' + print_id(Tom)
    print 'Cindy id: ' + print_id(Cindy)

    print '***修改不可变的变量值,名字***'
    Tom[0] = 'Tom'
    Cindy[0] = 'Cindy'
    print "Anndy: " + str(Anndy)
    print "Tom: " + str(Tom)
    print "Cindy: " + str(Cindy)
    print 'Anndy id: ' + print_id(Anndy)
    print 'Tom id: ' + print_id(Tom)
    print 'Cindy id: ' + print_id(Cindy)
    print "以上说明,修改不可变的变量值,不会影响其他对象"

    print '***修改可变的变量的值,改年龄为48***'
    Tom[1][1] = 48
    print "Anndy: " + str(Anndy)
    print "Tom: " + str(Tom)
    print "Cindy: " + str(Cindy)
    print 'Anndy id: ' + print_id(Anndy)
    print 'Tom id: ' + print_id(Tom)
    print 'Cindy id: ' + print_id(Cindy)
    print "以上说明,修改可变的变量的值,会影响其他对象的值,用不好这是会造成很大影响的"

    print "***深拷贝可以解决这个问题,如下:***"

    Anndy = ['Anndy', ['age', 24]]
    Tom = copy.deepcopy(Anndy)
    Cindy = copy.deepcopy(Anndy)

    print "Anndy: " + str(Anndy)
    print "Tom: " + str(Tom)
    print "Cindy: " + str(Cindy)
    # print '打印Anndy, Tom, Cindy容器元素的id'
    print 'Anndy id: ' + print_id(Anndy)
    print 'Tom id: ' + print_id(Tom)
    print 'Cindy id: ' + print_id(Cindy)
    print '修改Tom的年龄的值为68'
    Tom[1][1] = 68
    print "Anndy: " + str(Anndy)
    print "Tom: " + str(Tom)
    print "Cindy: " + str(Cindy)
    # print '打印Anndy, Tom, Cindy容器元素的id'
    print 'Anndy id: ' + print_id(Anndy)
    print 'Tom id: ' + print_id(Tom)
    print 'Cindy id: ' + print_id(Cindy)
    print '此次修改Tom的年龄没有影响到Anndy和Cindy的年龄,同时观察Anndy和Cindy的年龄的引用没变,但是Tom的年龄的引用的id变了指向了对象68的地址'

if __name__ == '__main__':
    test_copy()

以上test_copy()的执行结果:
ssh://[email protected]:22/home/wfq/python27/bin/python -u /home/wfq/ops/test/my_copy.py
Anndy: [‘Anndy’, [‘age’, 24]]
Tom: [‘Anndy’, [‘age’, 24]]
Cindy: [‘Anndy’, [‘age’, 24]]
Anndy id: [140123118376256, 140123118857824, 140123118518064, 16486192]
Tom id: [140123118376256, 140123118857824, 140123118518064, 16486192]
Cindy id: [140123118376256, 140123118857824, 140123118518064, 16486192]
修改不可变的变量值,名字
Anndy: [‘Anndy’, [‘age’, 24]]
Tom: [‘Tom’, [‘age’, 24]]
Cindy: [‘Cindy’, [‘age’, 24]]
Anndy id: [140123118376256, 140123118857824, 140123118518064, 16486192]
Tom id: [140123118518104, 140123118857824, 140123118518064, 16486192] – Tom的名字的引用地址改变了,指向了对象’Tom’
Cindy id: [140123118376352, 140123118857824, 140123118518064, 16486192] – Cindy的名字的引用地址改变了,指向了对象’Cindy’
名字为字符串,为不可变量,修改的时候会重新创建对象,仅仅包括原子对象的元组也属于这种情况,那么这样没有问题,还能节省内存
以上说明,修改不可变的变量值,不会影响其他对象
修改可变的变量的值,改年龄为48
Anndy: [‘Anndy’, [‘age’, 48]]
Tom: [‘Tom’, [‘age’, 48]]
Cindy: [‘Cindy’, [‘age’, 48]]
Anndy id: [140123118376256, 140123118857824, 140123118518064, 16487608]
Tom id: [140123118518104, 140123118857824, 140123118518064, 16487608]
Cindy id: [140123118376352, 140123118857824, 140123118518064, 16487608]
以上说明,修改可变的变量的值,会影响其他对象的值,用不好这是会造成很大影响的
年龄这个list是一个可变变量,修改他的值24为48的时候,这个list本身的引用地址140123118857824没变,但是里边的值从指向到24对象的地址16486192改指向到了48这个对象的地址16487608
深拷贝可以解决这个问题,如下:
Anndy: [‘Anndy’, [‘age’, 24]]
Tom: [‘Anndy’, [‘age’, 24]]
Cindy: [‘Anndy’, [‘age’, 24]]
Anndy id: [140123118376256, 140123118857536, 140123118518064, 16486192]
Tom id: [140123118376256, 140123118388504, 140123118518064, 16486192]
Cindy id: [140123118376256, 140123118388576, 140123118518064, 16486192]
修改Tom的年龄的值为68
Anndy: [‘Anndy’, [‘age’, 24]]
Tom: [‘Anndy’, [‘age’, 68]]
Cindy: [‘Anndy’, [‘age’, 24]]
Anndy id: [140123118376256, 140123118857536, 140123118518064, 16486192]
Tom id: [140123118376256, 140123118388504, 140123118518064, 16487128]
Cindy id: [140123118376256, 140123118388576, 140123118518064, 16486192]
此次修改Tom的年龄没有影响到Anndy和Cindy的年龄,同时观察Anndy和Cindy的年龄的引用没变,但是Tom的年龄的引用的id变了指向了对象68的地址16487128

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/wang725/article/details/84451501