1. 賦值語句發生了什么,Python中的變量的本質是什么?
比如: a = 1 或者 a = 'abc'
Python中的變量本質上是一個指針,也就是它保存的是對一個對象的引用.它本身并不會存放對象,它只是代表一個標簽,通過這個標簽可以找到具體存放對象的地方.
a = 1 或者 a = 'abc'
的過程就是, 先會在內存中創建一個int對象或者str對象,然后他們的值是1和abc.然后將a這個標簽貼到它們身上,有了這層關系,以后你訪問a就相當于是在訪問它們.有點類似于對象的引用.Python的動態性就是因為它的所有的變量的大小都是一樣的,都代表了一個指針.
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:40'
# python和java的變量本質上是不一樣的.
# python的變量實質上是一個指針,保存的就是一個地址.
# python的變量大小都是一樣的
a = 1 # 從內存中聲明一個int對象,值為1.然后a變量引用了1
# 相當于是a貼上了1上
a = 'abc'
# 變量賦值的過程是,先聲明對象,然后在建立關聯引用
a = [1,2,3]
b = a # b和a對應的是同一個對象
print(a is b)
b.append(4)
print(a)
2.is 和 == 的區別?
is 比較的是地址.注意小整數池和字符串,一般重復創建的時候會指向同一個對象
a = 1
b = 1
a is b True
a = '123'
b = '123'
a is b True
== 比較的是值,其實==重載了對象的__eq__方法
,而這個方法比較的是對象的值.
3.del語句和垃圾回收
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:54'
# python中的垃圾回收的算法是采用 引用計數為主,標記清除為輔,
# 分代管理.
a = object()
b = a
del a # 相當于是引用計數減少了1,并不是刪除了a對應的對象
print(b)
# print(a) # a已經被解除了引用,所以這里打印不出來了
class A:
# del刪除對象的引用關系的函數對應的函數是這個函數
def __del__(self):
pass
4.Python中參數傳遞中的一個經典錯誤
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/17 14:58'
def add(a, b):
a += b
return a
class Company:
# 傳遞一個列表的時候.這個默認的列表在函數對象初始化的時候就確定了.
# 所以如果沒有傳遞參數staffs都是用的一個空的list
# 但是這個空的list
# 這個值可以通過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) # 列表可變,所以結果會被修改.
print(a, b)
print('********元組*******')
a = (1, 2)
b = (3, 4)
c = add(a, b)
print(c)
print(a, b) # 結果不會變,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__)