先贴一段代码,然后我们解释一下代码里的内容
首先id()是获取变量的地址
# -*- coding: UTF-8 -*-
"""
1.变量的地址
2.原地修改与替换
3.深浅copy
"""
import copy
a = 1
b = 1.0
c = 1
d = a
a_dict = {'username':'MrDing', 'PhoneNumber:':'0462356', 'address:':'仙境'} # 原始字典
b_dict = a_dict # 等号赋值字典
c_dict = a_dict.copy() # 浅copy
d_dict = copy.deepcopy(a_dict) # 深copy
a_list = [1, 2, [4, 3, 5]]
b_list = a_list.copy() #浅copy
c_list = copy.deepcopy(a_list) #深copy
sequence = [a, b, c, d, a_dict, b_dict, c_dict, d_dict, a_list, b_list, c_list]
for i in range(len(sequence)):
target = sequence[i]
print('{}的地址:{},类型为{}'.format(target, id(target), type(id(target))))
print(a == b)
print(a is b)
print('\n\n')
print('进行修改')
print('\n')
a = 2
a_dict['username'] = 'MrLong'
x = {'address':'猪圈'}
a_dict.update(x)
a_list[2].sort()
for i in range(len(sequence)):
target = sequence[i]
print('{}的地址:{},类型为{}'.format(target, id(target), type(id(target))))
程序输出为:
C:\Users\D_S17\AppData\Local\Programs\Python\Python36\python.exe D:/Smart_Husband_Sen/Python/python基础/深浅copy.py
1的地址:1985244640,类型为<class 'int'>
1.0的地址:1891658895984,类型为<class 'int'>
1的地址:1985244640,类型为<class 'int'>
1的地址:1985244640,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891691170624,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891691170624,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891691170696,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891693678240,类型为<class 'int'>
[1, 2, [4, 3, 5]]的地址:1891693710408,类型为<class 'int'>
[1, 2, [4, 3, 5]]的地址:1891693825352,类型为<class 'int'>
[1, 2, [4, 3, 5]]的地址:1891693824328,类型为<class 'int'>
True
False
进行修改
1的地址:1985244640,类型为<class 'int'>
1.0的地址:1891658895984,类型为<class 'int'>
1的地址:1985244640,类型为<class 'int'>
1的地址:1985244640,类型为<class 'int'>
{'username': 'MrLong', 'PhoneNumber:': '0462356', 'address:': '仙境', 'address': '猪圈'}的地址:1891691170624,类型为<class 'int'>
{'username': 'MrLong', 'PhoneNumber:': '0462356', 'address:': '仙境', 'address': '猪圈'}的地址:1891691170624,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891691170696,类型为<class 'int'>
{'username': 'MrDing', 'PhoneNumber:': '0462356', 'address:': '仙境'}的地址:1891693678240,类型为<class 'int'>
[1, 2, [3, 4, 5]]的地址:1891693710408,类型为<class 'int'>
[1, 2, [3, 4, 5]]的地址:1891693825352,类型为<class 'int'>
[1, 2, [4, 3, 5]]的地址:1891693824328,类型为<class 'int'>
我们看到python变量实际存储的是值得地址就是说我们定义a = 1 的时候按人类得理解应该是a这里面放的是1这个数值,但实际上不是的,而是分配两块内存,一块用于存储我们所定义的这个数据,然后给我们这个变量再一个内存地址,存储的是我们数据的地址。
- 赋值运算(=): 实际和原变量就是同一变量,这意味着一旦改变原始数据和赋值数据的值那么两个变量会一起更改(共生死)
- 浅copy:分配了一个新的内存空间用来存放初始数据的值(但并不全是尽然)这样当进行替换的时候新的变量并没有改变,但当我们尝试进行原地修改的时候我们会发现这个新的变量依旧发生了改变。这是因为我们之前存储的数据里面还存放了别的数据而存放的这个位置依旧是地址,也就是说我们这里传递的其实再深层还是地址(好哥们)
- 深copy: 完全分配了整个内存空间给新的变量。因此完全脱离(谁也不认识谁)
我们可以看下这个数据就知道了
a_list[2].sort()
for i in range(3):
target = sequence[-3:][i][2]
print('元素为:列表深层次的地址:', target, id(target))
程序输出为:
元素为:列表深层次的地址: [3, 4, 5] 2199651830728
元素为:列表深层次的地址: [3, 4, 5] 2199651830728
元素为:列表深层次的地址: [4, 3, 5] 2199651869448
python这种存储数据的方式是有助于节省内存的,节省了大量的重复数据
其实本质就是在原地修改数据还是替换数据的问题
一定要注意这些变量实际存储的是数据地址,都是指向的关系(指针)