Python3 中对变量的测试和理解
python动态类型解释型语言
在python中
变量:
百度给出的定义:变量是一种使用方便的占位符,用于引用计算机内存地址。
可以理解为临时存储数据(对象)的盒子,其存储的内容可以随时根据需求而改变,变量类型就是其指向的对象的类型,本质存储的是其指向的对象的内存地址,一旦声明一个变量则必须为其赋值,否则其没有存在的意义(解释器也会报错)。访问一个变量就是获取其指向的对象,如果存储的是地址则继续寻找。
指向:一般我们说一个变量指向一个对象,就是变量引用了这个对象的内存地址,表示了变量就是这个对象
引用:把一个对象B用一个变量a来指向它,以便后续的方便使用,a引用了B的地址
浅拷贝和深拷贝
c = [2]
d = [1, c, 3]
e = d
f = copy.copy(d)
g = copy.deepcopy(d)
d[1][0] = 22
print(id(d))
print(id(e))
print(id(f))
print(id(g))
print(d, e, f, g)
print(id(d[1]))
print(id(e[1]))
print(id(f[1]))
print(id(g[1]))
结果:
2308673597512
2308673597512
2308673597704
2308673598984
[1, [22], 3] [1, [22], 3] [1, [22], 3] [1, [2], 3]
2308673598920
2308673598920
2308673598920
2308673598856
对于可变类型:浅拷贝重新开辟一块内存空间,将最外层的引用拿过来,深拷贝重新开辟一块内存空间,将对象的中不可变类型的引用地址拿过来
class A(object):
def init(self):
self.b_list = []
def b_append(self, b):
self.b_list.append(b)
class B(object):
def init(self, name):
self.name = name
if name == 'main':
a1 = A()
b1 = B('123')
b2 = B('456')
a1.b_append(b1)
a1.b_append(b2)
a = a1
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
b1.name = '789'
print(a.b_list[0].name)
print(b.b_list[0].name)
print(c.b_list[0].name)
print(d.b_list[0].name)
789
789
789
123