用来练手的python 练习题,原链接 : python练习实例7
练习实例7非常的简单也有意思。题干 : 将一个列表的数据复制到另一个列表中。
完成这个操作的代码非常简单,即使是我这样的初学者应该也是一语道破,赋值语句嘛。但这里我们就列举出几种不同的赋值方法,其背后的逻辑和细节其实是大不相同的。
下面放出源代码,首先当然是使用我们的赋值语句进行数据复制了,这里我使用的是numpy array代替list :
import numpy as np
a = np.array([1,2,3,4,5])
c = a
print(c)
print(a)
print(c is a)
print(id(c))
print(id(a))
输出结果如下 :
我们不难发现,当我们使用赋值语句 “=” 直接对numpy 矩阵进行复制时,实际我们是让c与a指向了同一块内存。a和c不仅数值一致,他们在内存中对应的地址也是一样的。那么我们对a进行一些操作,看看会有什么发生呢:
a -= 1
print(a)
print(c)
print(c is a)
print(id(a))
print(id(c))
这里我们对a进行自增(自增和自减操作一样),输出结果如下:
我们发现,当对变量进行自增或自减操作时,变量的地址并没有改变,相应的,两个指向同一内存块的变量a和c的值当然同时改变了。
那么如果我们对a进行减法运算会发生什么呢,代码如下:
a = a - 1
print(a)
print(c)
print(c is a)
print(id(a))
print(id(c))
这次我们对矩阵a进行减法运算,输出结果如下:
不难发现,当我们运算a=a−1a =a -1a=a−1时,python为新的变量a重新分配了内存,自然而然地,a矩阵和c矩阵就不再对应同一个内存地址了。
我们尝试了使用赋值语句进行复制,那么如果我们使用np.copy()方法会怎么样呢?
源代码如下:
f = np.copy(a)
print(f)
print(a)
print(a is f)
print(id(a))
print(id(f))
输出结果如下:
我们发现,使用copy方法进行复制时,仅仅只是对数值的复制,Python会为变量重新分配内存,而不会像赋值语句一样使两个变量公用同一块内存空间。
使用下述代码也可以实现copy一样的作用,只复制数值,而不改变变量的地址:
g = a[:]
print(g)
print(a)
print(a is g)
print(id(a))
print(id(g))
输出结果: