1. 賦值語(yǔ)句發(fā)生了什么,Python中的變量的本質(zhì)是什么?
比如: a = 1 或者 a = 'abc'
Python中的變量本質(zhì)上是一個(gè)指針,也就是它保存的是對(duì)一個(gè)對(duì)象的引用.它本身并不會(huì)存放對(duì)象,它只是代表一個(gè)標(biāo)簽,通過(guò)這個(gè)標(biāo)簽可以找到具體存放對(duì)象的地方.
a = 1 或者 a = 'abc'
的過(guò)程就是, 先會(huì)在內(nèi)存中創(chuàng)建一個(gè)int對(duì)象或者str對(duì)象,然后他們的值是1和abc.然后將a這個(gè)標(biāo)簽貼到它們身上,有了這層關(guān)系,以后你訪問(wèn)a就相當(dāng)于是在訪問(wèn)它們.有點(diǎn)類(lèi)似于對(duì)象的引用.Python的動(dòng)態(tài)性就是因?yàn)樗乃械淖兞康拇笮《际且粯拥?都代表了一個(gè)指針.
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:40'
# python和java的變量本質(zhì)上是不一樣的.
# python的變量實(shí)質(zhì)上是一個(gè)指針,保存的就是一個(gè)地址.
# python的變量大小都是一樣的
a = 1 # 從內(nèi)存中聲明一個(gè)int對(duì)象,值為1.然后a變量引用了1
# 相當(dāng)于是a貼上了1上
a = 'abc'
# 變量賦值的過(guò)程是,先聲明對(duì)象,然后在建立關(guān)聯(lián)引用
a = [1,2,3]
b = a # b和a對(duì)應(yīng)的是同一個(gè)對(duì)象
print(a is b)
b.append(4)
print(a)
2.is 和 == 的區(qū)別?
is 比較的是地址.注意小整數(shù)池和字符串,一般重復(fù)創(chuàng)建的時(shí)候會(huì)指向同一個(gè)對(duì)象
a = 1
b = 1
a is b True
a = '123'
b = '123'
a is b True
== 比較的是值,其實(shí)==重載了對(duì)象的__eq__方法
,而這個(gè)方法比較的是對(duì)象的值.
3.del語(yǔ)句和垃圾回收
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:54'
# python中的垃圾回收的算法是采用 引用計(jì)數(shù)為主,標(biāo)記清除為輔,
# 分代管理.
a = object()
b = a
del a # 相當(dāng)于是引用計(jì)數(shù)減少了1,并不是刪除了a對(duì)應(yīng)的對(duì)象
print(b)
# print(a) # a已經(jīng)被解除了引用,所以這里打印不出來(lái)了
class A:
# del刪除對(duì)象的引用關(guān)系的函數(shù)對(duì)應(yīng)的函數(shù)是這個(gè)函數(shù)
def __del__(self):
pass
4.Python中參數(shù)傳遞中的一個(gè)經(jīng)典錯(cuò)誤
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:58'
def add(a, b):
a += b
return a
class Company:
# 傳遞一個(gè)列表的時(shí)候.這個(gè)默認(rèn)的列表在函數(shù)對(duì)象初始化的時(shí)候就確定了.
# 所以如果沒(méi)有傳遞參數(shù)staffs都是用的一個(gè)空的list
# 但是這個(gè)空的list
# 這個(gè)值可以通過(guò)Company的default
def __init__(self, name, staffs=[]):
self.name = name
self.staffs = staffs
def add(self, staff_name):
self.staffs.append(staff_name)
def remove(self, staff_name):
self.staffs.remove(staff_name)
if __name__ == '__main__':
a = 1
b = 2
c = add(a, b)
print(c)
print(a, b)
print('**********列表*******')
a = [1, 2]
b = [3, 4]
c = add(a, b)
print(c) # 列表可變,所以結(jié)果會(huì)被修改.
print(a, b)
print('********元組*******')
a = (1, 2)
b = (3, 4)
c = add(a, b)
print(c)
print(a, b) # 結(jié)果不會(huì)變,a和b是元組不可變
com1 = Company('com1',['bob1','bob2'])
com1.add('bob3')
com1.remove('bob1')
com2 = Company('com2')
com2.add('bob4')
com3 = Company('com3')
com3.add('bob5')
print(com2.staffs)
print(com3.staffs)
print(com2.staffs is com3.staffs)
print(Company.__init__.__defaults__)