# -*- 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://wfq@192.168.174.132: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