一入python深似海--变量和对象

一、基本原理

Python中一切都是对象,变量是对象的引用。这是一个普遍的法则。我们举个例子来说,Python是如何来处理的。

x = 'blue'
y = 'green'
z = x  

当python执行上面第一句的时候,会在heap中首先创建一个str对象,其文本内容为blue,同时还创建一个名为x的对象引用,x引用的就是这个str对象。第二句也是类似;第三条创建了一个名为z的新对象引用,并将其设置为对象引用x所指向的相同对象。如下图的变化。

所以看出在Python中赋值操作符号“=”的作用是,将对象引用和内存中的某个对象进行绑定。如果对象已经存在,就进行简单的重新绑定,以便引用“=”右边的对象;如果对象引用尚未存在,就首先创建对象,然后将对象引用和对象进行绑定。

Python使用“动态类型”机制,也就是说,在Python程序中,任何时候可以根据需要,某个对象引用都可以重新绑定到另一个不同的对象上(不要求是相同的类型),这和其他强化型语言如(C++,Java)不太一样,只允许重新绑定相同类型的对象上。在Python中,因为有“动态类型”机制,所以一个对象引用可以执行不同类型的对象适用的方法。当一个对象不存在任何对象引用的时候,就进入了垃圾收集的过程。

查看类型程序:

import types
type(100)
>>> a=100
>>> a/10
10
>>> a[0]

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a[0]
TypeError: 'int' object has no attribute '__getitem__'
>>> a='hello'
>>> a[0]
'h'
>>> a/10

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    a/10
TypeError: unsupported operand type(s) for /: 'str' and 'int'
>>> 

第一句 a = 100

Python会在heap创建一个int对象,其内容为100,同时创建a变量,其值指向heap中的int对象

第二句 a/10

Python适用“动态类型”机制,判断a指向的对象是int型,可以适用/(除法)操作。于是便进行运算产生结果。(它会在heap中在创建一个10.0的对象么?)

第三句 a[0]

Python适用“动态类型”机制,判断a指向的对象是int型,并不适用[](分片)操作。于是就进行报错。

第四句 a = ‘hello‘

Python会在heap创建一个str对象,其内容为hello,同时改变a变量,使得其值指向heap中的str对象。同时原来的int对象,由于不在存在对象引用,所以就进入了垃圾收集过程。

第五句 a[0]

Python适用“动态类型”机制,判断a指向的对象是str型,可以适用[](分片)操作。于是便进行运算产生结果。

第六句 a/10

Python适用“动态类型”机制,判断a指向的对象是str型,并不适用/(除法)操作。于是就进行报错。

总之 :在Python中一切都是对象,变量总是存放对象引用。当一个对象没有变量指向它的时候,它便进入了垃圾收集过程。Python的“动态类型”机制,负责检查变量的对象引用适用操作。如果该对象不适用该操作,则会直接报错。一句话”变量无类型,对象有类型 “

二、python的id(),==,is的差别

1. id():获取的是对象在内存中的地址

2. is :比对2个变量的对象引用(对象在内存中的地址,即id() 获得的值)是否相同。如果相同则返回True,否则返回False。换句话说,就是比对2个变量的对象引用是否指向同一个对象。

3. ==:比对2个变量指向的对象的内容是否相同。

一入python深似海--变量和对象,布布扣,bubuko.com

时间: 2024-08-02 07:01:46

一入python深似海--变量和对象的相关文章

一入python深似海--list

几个实例展示python中数据结构list的魅力! list变量申明 the_count = [1, 2, 3, 4, 5] fruits = ['apples', 'oranges', 'pears', 'apricots'] change = [1, 'pennies', 2, 'dimes', 3, 'quarters'] 访问list元素 array= [1,2,5,3,6,8,4] #其实这里的顺序标识是 (0,1,2,3,4,5,6) (-7,-6,-5,-4,-3,-2,-1)#有

一入python深似海--浅拷贝与深拷贝

python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝.要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.可以说 Python 没有赋值,只有引用.如,a=1,变量a只是整数对象1的引用. 可变对象与不可变对象及其引用 一.不可变对象 不可变对象包括:数字,字符串,元组. 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.

一入python深似海--while-loop与for-loop

while loops 定义与实例 i = 0 numbers = [] while i < 6: print "At the top i is %d" % i numbers.append(i) i = i + 1 print "Numbers now: ", numbers print "At the bottom i is %d" % i print "The numbers: " for num in numbe

一入python深似海--对象的属性

Python中一切皆是对象,每个对象都可以有多个属性.Python是如何管理这些属性呢?我们来探讨一下. 属性的__dict__系统 对象的属性包含两部分:类属性和对象属性.对象的属性可能来自于其类的定义,叫做类属性.类属性可能来自于类的定义自身,也可能来自父类.一个对象的属性还可能是该对象实例定义的,叫做对象属性. 对象的属性存储在对象的__dict__属性中.__dict__为一个字典,键为属性名,对应的值为属性本身.下面是一个例子. class bird(object): feather

一入python深似海--函数与文件

先上写干货,几个开源网站: github.com launchpad.net gitorious.org sourceforge.net freecode.com 今天介绍一下python函数和文件读写的知识. 函数 def print_two(*args):#That tells Python to take all the arguments to the function and then put them in args as a list arg1,arg2=args print "a

一入python深似海--split

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

一入python深似海--range()与for

range用法 使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节. 这里记录一下: range(1,5)#代表从1到5(不包含5) [1,2,3,4] range(1,5,2)#代表从1到5,间隔2(不包含5) [1,3] range(5)#代表从0到5(不包含5) [0,1,2,3,4] 再看看list的操作: array= [1,2,5,3,6,8,4] #其实这里的顺序标识是 [1,2,5,3,6,8,4] (0,1,2,3,4,5,

一入python深似海--class

python class 分为三个部分:class and object(类与对象),inheritance(继承),overload(重载)and override(覆写). class and object 类的定义,实例化,及成员访问,顺便提一下python中类均继承于一个叫object的类. class Song(object):#definition def __init__(self, lyrics): self.lyrics = lyrics#add attribution def

一入python深似海--Dictionaries

定义及应用 定义 <span style="font-size:18px;">stuff = {'name': 'Zed', 'age': 36, 'height': 6*12+2}#key:value pairs</span> 实例 # create a mapping of state to abbreviation states = { 'Oregon': 'OR', 'Florida': 'FL', 'California': 'CA', 'New Yo