名字与对象之间的建立引用与解除引用:
看似和其他编程语言中的赋值相同,但是不同,每一个字面量都是一个对象有自己的方法,我们使用“=”是建立一种引用的关系,对象之间的运算往往也是返回一个新的对象的副本,看似从a=1到a=2是a的内容从1变成2,事实上是a指向的对象从1变成2,python自己对已经创建的内存中储存的数据(对象实际储存数值)有一个引用数目的记录,一旦引用数目归零(没有使用这个对象,这个值的函数或者方法了,)那么这个对象所在的内存空间就会被自动释放。也就是说python中的变量名字类似于引用和指针一样。
可以认为变量储存的是地址。
我们用"="建立一种引用的关系,用del语句来清除这种引用关系(del类比c中的free)。
a = 1 del a
is 用于判断两个对象是否指向同一个对象,id也可以。
==仅用于判断两个变量指向的对象值是否相等。
关于可修改和不可修改对象:
str可以支持很多方法,也像一个list那样可以通过下标访问,但是要注意,python中的str是不可变的变量类型,也就是说很多看起来修改了字符串的操作只不过是又产生了一个副本罢了,如果不将这个副本使用,str变量本身不会有任何变化。
s = 'i am you' s.capitalize() print(s) # i am you没有进行大写的转换 str1 = s.capitalize() print(str1) # I am you
这里就要注意python中存在immutable(可修改)和mutable(不可修改)两种类型的变量,应当注意一点的是在我们修改了变量的值其实大多数情况下并不是改变了其内容,而是改变了这个变量的指向,Python中的变量很像c++中的指针,变量是指向一块内存空间的,但是这块内存空间里面的内容是不可变的(为了保护数据的内容,高级语言的强特性),我们很多时候以为在改变的python变量的值事实上是基于原来变量的内容修改之后形成的副本,就比如str无法对自己进行修改操作,如果使用就必须创建副本,这就是immutable的特点,我们如果做了“改变”的操作,事实上只是创建了一个修改之后的副本并且让变量指向这个副本,python中有对内存空间引用的记数,如果引用计数清零那么自动释放这段内存空间。我们可以使用id()函数来确定一个变量所指向的内存空间的位置,类似一个地址,immutable变量在修改之后会发现id()的返回值发生了改变。
而list和dict则是mutable,个人理解比如list,一个list变量内储存的是许多变量变量名字,也就是说list本身在自己的内容中就是存着指向不同的数据空间的变量,那么改变其内容是可以的,也就是改变变量本身,(类比list是存着指针的数组哦)。这是python的特性,也是其比较慢和占用内存空间的一个原因。
mutable对象在修改之后id是不变的哦。如果没有任何一个变量指向这个内存空间那么它就会释放。
文档字符串:
python中如果一行写不下可以用反斜线来在下一行接着写。代码分隔。
文档字符串用三个引号在首尾,这个字符串中所有的空格和换行都可以存储,就像一个txt一样.(在三引号之间所有的空格和锁紧都被储存在字符串中了)
(例子中第一个字符是 )
一行写多行,用分号分隔同一行两个语句。