A = ['nupt',56,['I','you','he']]
B = A # 把A赋值给B
# 比较A和B的值
print A
>>>['nupt',56,['I','you','he']]
print B
>>>['nupt',56,['I','you','he']] # B的值与A相同
# 比较A和B所在的地址
print id(A)
>>>58890248
print id(B)
>>>58890248 # B的地址与A相同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59288352L,57107912L,58888776L]
print [id(ele) for ele in B]
>>>[59288352L,57107912L,58888776L] # B中每个元素所在地址与A相同
# 更改A的值,看B的各项变化
A[0] = 'NanJing'
A[2].append('she')
# 比较A和B的值
print A
>>>['NanJing',56,['I','you','he','she']]
print B
>>>['NanJing',56,['I','you','he','she']] # B的值仍与A相同
# 比较A和B所在的地址
print id(A)
>>>58890248 # A的地址不变
print id(B)
>>>58890248 # B的地址仍与A相同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59285712L,57107912L,58888776L] # A[0]地址变了,A[2]没变
print [id(ele) for ele in B]
>>>[59285712L,57107912L,58888776L] # B中每个元素所在地址与A相同
下面来看看
import copy # 导入copy模块
A = ['njupt',56,['I','you','he']]
B = copy.copy(A) # 把A浅拷贝给B
# 比较A和B的值
print A
>>>['njupt',56,['I','you','he']]
print B
>>>['njupt',56,['I','you','he']] # 浅拷贝的B,值与A相同
# 比较A和B所在的地址
print id(A)
>>>58890824
print id(B)
>>>59328584 # 浅拷贝的B,地址与A不同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59288312L,57107912L,58219080L]
print [id(ele) for ele in B]
>>>[59288312L,57107912L,58219080L] # 浅拷贝的B,元素所在地址与A相同
# 更改A的值,看B的各项变化
A[0] = 'NanJing'
A[2].append('she')
# 比较A和B的值
print A
>>>['NanJing',56,['I','you','he','she']]
print B
>>>['njupt',56,['I','you','he','she']] # 注意:浅拷贝的B,值与A不同
# 比较A和B所在的地址
print id(A)
>>>58890824 # A的地址不变
print id(B)
>>>59328584 # 浅拷贝的B,地址不变,仍与A不同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59286912L,57107912L,58219080L] # A[0]地址变了,A[2]没变
print [id(ele) for ele in B]
>>>[59288312L,57107912L,58219080L] # B中每个元素所在地址与A相同
再来看看
import copy # 导入copy模块
A = ['nupt',56,['I','you','he']]
B = copy.deepcopy(A) # 把A浅拷贝给B
# 比较A和B的值
print A
>>>['nupt',56,['I','you','he']]
print B
>>>['nupt',56,['I','you','he']] # 深拷贝的B,值与A相同
# 比较A和B所在的地址
print id(A)
>>>58888776
print id(B)
>>>58890824 # 深拷贝的B,地址与A不同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59288312L,57107912L,58890248L]
print [id(ele) for ele in B]
>>>[59288312L,57107912L,59327880L]
# 深拷贝的B,元素所在地址与A不完全相同
# 更改A的值,看B的各项变化
A[0] = 'NanJing'
A[2].append('she')
# 比较A和B的值
print A
>>>['NanJing',56,['I','you','he' ]]
print B
>>>['njupt',56,['I','you','he']] # 注意:深拷贝的B,值与A不同
# 比较A和B所在的地址
print id(A)
>>>58888776 # A的地址不变
print id(B)
>>>58890824 # 深拷贝的B,地址不变,仍与A不同
# 比较A中的每个元素与B中每个元素的地址
print [id(ele) for ele in A]
>>>[59288592L,57107912L,58890248L] # A[0]地址变了,A[2]没变
print [id(ele) for ele in B]
>>>[59288312L,57107912L,59327880L] # B中每个元素所在地址不变
Python中,类型属于对象。如a=23,变量a不是整数型,a仅仅是一个对象的引用(相当于指针),a可以指向list型,可以指向str型。
可变类型的对象:整数、字符串、元组。
如:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,而是相当于新生成一个a。
不可变类型对象: 列表,字典。
如:变量赋值 b=[1,2,3,4] 后再赋值 b[2]=5 则是将 list b的第三个元素值更改,b本身没有动,只是其内部的一部分值被修改了
(1)B=A:
B与A值一样,指向的地址一样,内部元素各自地址一样。即:B is A, B[ele] is A[ele]
A的一切元素变,B也变
(2)B=copy.copy(A)
B与A值一样,指向的地址不一样,内部各元素地址一样。即:B is not A, B[ele] is A[ele]
A的“可变类型对象”变,B也变
(3)B=deepcopy(A)
B与A值一样,指向的地址不一样,内部元素地址可能不一样。即:B is not A, B[ele] is not A[ele]
A的“可变类型对象”变,B不变