老板,来一斤BUG!——Python

2019/3/3:

Python中的列表赋值:

import copy


def ID(x):
    id_x = [id(i) for i in x]
    id_x.insert(0, id(x))
    print(x, id_x)
    return id_x



# print(id(1))

a = [1, [2, 3]]  # 创建 列表list,将其前两指向,分别指向 1 2,再创建新变量a,使其指向该列表
#                                                   因为是新变量,所以 a 有自己的地址
b = a  # b 指向 a 所指的对象,即该列表,若 此后 a 更改指向,b不变;
#                                     若 a所指的对象:该列表[1,2]改变,a、b均改变
c = a[:]  			# 创建新变量c, 令其 直接指向 a所指列表内指向的元素
d = [i for i in a]  # 创建新变量d, 令其 直接指向 a所指列表内指向的元素
e = a.copy()		# 创建新变量e, 令其 直接指向  a所指列表内指向的元素
f = copy.copy(a)  	# 同上,也即 ------>浅拷贝<------
g = copy.deepcopy(a)  # 深拷贝,令其 直接指向,a 所指列表内指向的元素, 以及 元素的所指元素...etc
ID(a)
ID(b)
ID(c)
ID(d)
ID(e)
ID(f)
ID(g)

a[0] = 50  # 这里的具体操作是:找到 a所指——>该列表[1,[2,3]], 更改其第0个指向,由1变为 50
ID(a)		# a 指向 该列表,该列表改变,故 a 的第一个元素改变
ID(b)		# 同上
ID(c)		# 该列表改变了指向,但 c 直接指向该列表一开始所指的元素,故 c 不变
ID(d)		# 同上
ID(e)		# 同上
ID(f)		# 同上
ID(g)		# 同上

a[1][0] = 60
ID(a)		# 该列表的指向未改变,但该列表的子列表改变了指向,故 a 变
ID(b)		# 同上
ID(c)		# 同上
ID(d)		# 同上
ID(e)		# 同上
ID(f)		# 同上
ID(g)  		# 因为是深拷贝, 故不变

参考:一切都是对象,一切都是指针,一切都是东西(python的编程哲学)

猜你喜欢

转载自blog.csdn.net/rotk2015/article/details/88074046