文章标题:Python学习笔记(五)Python动态类型和引用
文章链接:http://blog.csdn.net/suipingsp/article/details/39295295
文章标题:Python函数参数默认值的陷阱和原理深究
文章链接:http://cenalulu.github.io/python/default-mutable-arguments/
因为自己对于python中的引用类型有些混,加之看到了上面的文章中的链接,有了一些想法,就写了下来。
if __name__ == "__main__":
a = 3 # 赋值操作
# 创建了一个对象,这个对象是一个int对象,这个int对象的值为3,
# (如果变量a尚未被创建的话),创建了一个变量a,
# 将变量a和int对象(其值为3)关联起来.此时,变量a指向了内存中的一个int对象(其值为3)
a *= 2 # 乘法运算+赋值操作
# 创建了一个int对象(其值为2),
# 找到变量a指向的对象(int对象,其值为3),
# (乘法运算)将int对象(其值为3)和int对象(其值为2)做乘法运算,得到(创建出了)一个新的int对象(其值为6),
# (赋值操作)将变量a和这个新的int对象(其值为6)关联起来.此时,变量a指向了内存中的一个int对象(其值为6)
a = "qwert" # 赋值操作
# 创建了一个对象,这个对象是一个str对象,这个str对象的值为"qwert"
# 将变量a和str对象(其值为"qwert")关联起来.此时,变量a指向了内存中的一个str对象(其值为"qwert")
b = a # 赋值操作
# (如果变量b尚未被创建的话),创建了一个变量b,
# 将变量b和"变量a指向的对象"关联起来,此时变量a和变量b指向了内存中的同一个对象
b = b + "123" # 加法运算+赋值操作
# 找到变量b指向的对象(str对象,其值为"qwert")
# 将str对象(其值为"qwert")和str对象(其值为"123")做str.__add__运算,得到一个新的str对象(其值为"qwert123")
# 将变量b和这个新的str对象(其值为"qwert123")关联起来.
# 此时,变量b指向了内存中的一个str对象(其值为"qwert123"),变量a指向了内存中的另一个str对象(其值为"qwert")
a = [1, "str"]
# 创建了一个list对象,其值为[1, "str"],
# 将变量a指向内存中的一个list对象(其值为[1, "str"]),
b = a
# 将变量b和"变量a指向的对象"关联起来,此时变量a和变量b指向了内存中的同一个对象
b.append("obj")
# 找到变量b指向的对象(list对象,其值为[1, "str"])
# 调用这个对象的append方法,将str对象(其值为"obj")添加到这个对象里面.此时,这个对象因为append方法该变了自己,这个list对象变成了[1, "str", "obj"]
# 因为变量a和变量b指向了同一个对象,但是这个对象被(自己的成员函数)改变了,
# 所以,变量a改变了,(变量a指向的内存中的对象改变了)
# 所以,变量b改变了,(变量b指向的内存中的对象改变了)
print(b) # [1, 'str', 'obj']
print(a) # [1, 'str', 'obj']
# 创建了一个对象,这个对象的值,在创建之后,绝对不会再被改变,这样的类有int,float,str,等
# 创建了一个对象,这个对象还可以被自己的成员函数改变,这样的类有list,dict,array,bytearray,等,超级多,
# 对于tuple,一个tuple被创建出来之后,它里面的那些个item不可以增加和减少了,但是item自身是可以被自己的数据成员改变的,
testTuple = (1, "str", [3.14, True, None], bytearray("qwert", encoding="utf_8"))
print("初始化后的tuple=", testTuple, sep="")
try:
testTuple[0] = 3
except TypeError as e:
print(e)
finally:
pass
testTuple[2].append("obj")
testTuple[3].append(49)
print("修改后的tuple=", testTuple, sep="")
import sys
sys.exit(0)
完。