1."is" 和 "=="的区别是什么?
== 比较的是变量的值
is 比较的是变量的内存地址
例如 :
a = 1, b = 1
a is b
此时返回结果为True
is 比较的是两个变量的存储地址
在python中,从-5——256的整数是存放在同一块内存中的,所以当我们这样定义时:
a = 257, b = 257
返回值为False,当变量大于256或者小于-5时,返回值就会从True变为False
而我们的"=="比较的是两个变量的值
所以无论怎么定义包括字符串在内,只要值相等,a == b 的返回值就是True
2.赋值、深拷贝和浅拷贝的区别是什么?
⑴赋值(assignment)
>>>a = [1,2,3]
>>>b = a
>>>print(id(a), id(b), sep='\n')
139701469405552
139701469405552
在Python中,用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。
如上例,通过使用内置函数 id() ,可以看出 a 和 b 指向内存中同一个对象。a is b会返回 True 。
⑵、前拷贝和深拷贝(deep copy)
所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。
深拷贝只有一种方式:copy模块中的deepcopy函数。
>>> import copy
>>>a= [1,2,3]
>>>b= copy.deepcopy(a)
>>>print(id(a),id(b))
140601785065840 140601785066200
>>>for x, y in zip(a,b):
...print(id(x),id(y))
...
140601911441984 140601911441984
140601911442016 140601911442016
140601911442048 140601911442048
看了上面的例子,有人可能会疑惑:
为什么使用了深拷贝,a和b中元素的id还是一样呢?
答:这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用。而且这种机制并不会影响 a 和 b 的相互独立性,因为当两个元素指向同一个不可变对象时,对其中一个赋值不会影响另外一个。
我们可以用一个包含可变对象的列表来确切地展示“浅拷贝”与“深拷贝”的区别:
>>>importcopy
>>>a = [[1,2],[5,6], [8,9]]
>>>b = copy.copy(a) # 浅拷贝得到b
>>>c = copy.deepcopy(a) # 深拷贝得到c
>>>print(id(a), id(b)) # a 和 b 不同
139832578518984 139832578335520
>>>forx, yinzip(a, b):# a 和 b 的子对象相同
...print(id(x), id(y))
...
139832578622816 139832578622816
139832578622672 139832578622672
139832578623104 139832578623104
>>>print(id(a), id(c)) # a 和 c 不同
139832578518984 139832578622456
>>>forx, yinzip(a, c): # a 和 c 的子对象也不同
...print(id(x), id(y))
...
139832578622816 139832578621520
139832578622672 139832578518912
139832578623104 139832578623392
从这个例子中可以清晰地看出浅拷贝与深拷贝地区别。
网友评论