精华内容
下载资源
问答
  • Python对象内存地址

    万次阅读 多人点赞 2018-08-02 16:58:59
    这里我们只简单看下python对象内存地址的相关基础知识,以及编码过程中一些注意事项,关于python解释器的内存管理机制,涉及到解释器内核的内存池原理,这里不做深入探讨,有兴趣的朋友可以去阅读解释器源代...

        在python中,万物皆对象,常见的整数、浮点数、字符串、元祖、列表等类型,以及各种class、class instance等等都是对象。这些对象在python解释器内部的地址是怎样的呢?这里我们只简单看下python对象内存地址的相关基础知识,以及编码过程中一些注意事项,关于python解释器的内存管理机制,涉及到解释器内核的内存池原理,这里不做深入探讨,有兴趣的朋友可以去阅读解释器源代码。

    0x01 不可变对象

        不可变对象是指对象的内存值不能被改变。Python中变量以引用的方式指向对象,如果变量引用了不可变对象,当改变该变量时,由于其所指的对象的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址,即变量引用了新的对象。

        数值类型(整数和浮点)、字符串str、元组tuple都是不可变类型。比如a=1,b=[1],c={'a':1},id(a)、id(b[0])、id(1)、id(c['a'])将输出一样的值,因为1是不可变对象,其在内存中是不可改变的。

    0x02 可变对象

        可变对象是指对象的内存值可以被改变,变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的内存地址,通俗点说就是原地改变。列表list、字典dict、集合set是可变类型。

    0x03 对象的内存地址

        可以使用内置函数id()查看python对象的内存地址。下面是一些注意事项:

        (1) python中所有数字、字符串、list等值,创建时会分配内存空间,变量通过引用的方式使用它们。比如a=1和b=1,id(a)和id(b)的输出一样,表示a和b都指向相同的内存地址,即引用了同一个不可变对象;但是a=[1]和b=[1],id(a)和id(b)将输出不一样的值,a和b指向的是不同的内存地址,即引用了不同的可变对象,说明各可变对象是相互独立的,在内存中有独立的内存地址

        (2) 可用 is 判断两个对象的id(即内存地址)是否一样,用 == 判断两个对象的值是否一样。None值也有内存地址

        (3) list、set对象有各自的独立内存空间,他们的各元素以引用的方式指向可变、不可变对象;

        (4) 函数形参的默认值,在内存中会开辟独立的内存空间。比如测试代码中test函数的param参数,其默认值是空list,如果调用时未传参,则param指向内存中预先分配好的地址,该地址存储的是list类型的值;当调用时传参为a,则param引用了a指向的内存空间;

        (5) python使用引用计数和垃圾回收来释放内存对象,每个内存对象都维护了一个引用计数包括各种数字、字符串、list、set等类型值,以及类实例对象等等,当这些对象的引用计数为 0 时,会被解释器回收内存。每次对对象进行引用操作,都会导致其引用计数加1, 如下面测试代码中的整数1,列表a、b、c、d、n都引用了整数1,以及test函数中的append操作,都会导致数字1的引用计数加1

        (6) copy和deepcopy方法都创建了新的内存对象,如测试代码中的b和c都是新的变量,其各个元素可能是指向同一个内存空间。赋值操作是指向同一个内存块,同时增加引用计数。copy是浅拷贝,deepcopy是深拷贝,特别对于可变对象,copy是以引用的方式指向同一个可变对象,而deepcopy会开辟新的内存地址,也就是创建了新的可变对象。

    0x04 测试代码

    # -*- coding: utf8 -*-
    import copy
    import sys
    
    a = [1, 2, [3, 4]]
    b = copy.copy(a)
    c = copy.deepcopy(a)
    d = a
    
    print 'address of a:', id(a)
    print 'address of b:', id(b)
    print 'address of c:', id(c)
    print 'address of d:', id(d)
    print 'address of 1:', id(1)
    print 'address of element 0 in a:', id(a[0])
    print 'address of element 0 in b:', id(b[0])
    print 'address of element 0 in c:', id(c[0])
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    a[0] = 99
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    print 'address of element 0 in a:', id(a[0])
    print 'address of element 0 in b:', id(b[0])
    print 'address of element 0 in c:', id(c[0])
    
    print 'address of element 2 in a:', id(a[2])
    print 'address of element 2 in b:', id(b[2])
    print 'address of element 2 in c:', id(c[2])
    
    a[2].append(5)
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    def test(param=[]):
        print 'address of param:', id(param)
        param.append(1)
        print 'reference count of 1:', sys.getrefcount(1)
        return param
    
    print test(a)
    print test()
    print test()
    print 'a=', a
    print 'b=', b
    print 'c=', c
    print 'd=', d
    
    print 'reference count of 1:', sys.getrefcount(1)
    n = 1
    print 'reference count of 1:', sys.getrefcount(1)
    del n
    print 'reference count of 1:', sys.getrefcount(1)
    
    

    0x06 运行结果

    address of a: 54681224
    address of b: 54716296
    address of c: 54692104
    address of d: 54681224
    address of 1: 48258856
    address of element 0 in a: 48258856
    address of element 0 in b: 48258856
    address of element 0 in c: 48258856
    a= [1, 2, [3, 4]]
    b= [1, 2, [3, 4]]
    c= [1, 2, [3, 4]]
    d= [1, 2, [3, 4]]
    a= [99, 2, [3, 4]]
    b= [1, 2, [3, 4]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4]]
    address of element 0 in a: 48260488
    address of element 0 in b: 48258856
    address of element 0 in c: 48258856
    address of element 2 in a: 54692232
    address of element 2 in b: 54692232
    address of element 2 in c: 54716360
    a= [99, 2, [3, 4, 5]]
    b= [1, 2, [3, 4, 5]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4, 5]]
    address of param: 54681224
    reference count of 1: 161
    [99, 2, [3, 4, 5], 1]
    address of param: 54716424
    reference count of 1: 162
    [1]
    address of param: 54716424
    reference count of 1: 163
    [1, 1]
    a= [99, 2, [3, 4, 5], 1]
    b= [1, 2, [3, 4, 5]]
    c= [1, 2, [3, 4]]
    d= [99, 2, [3, 4, 5], 1]
    reference count of 1: 163
    reference count of 1: 164
    reference count of 1: 163

     

    展开全文
  • Python3中的json对象与python对象转化

    千次阅读 2019-04-13 09:18:35
    1.直接将Python对象转成json对象,使用方法dumps() import json d = {"姓名": "curry", "age": 30, "hobby": "basketball"} d_json = json.dumps(d, ensure_ascii=False) print("json对象d_json: ", d_json) 2....
    • 1.直接将Python对象转成json对象,使用方法dumps()
    import json
    
    d = {"姓名": "curry", "age": 30, "hobby": "basketball"}
    d_json = json.dumps(d, ensure_ascii=False)
    print("json对象d_json: ", d_json)
    
    • 2.将Python对象转成json对象后,使用方法dump(),将转化后的json对象保存到json文件中。其中参数ensure_ascii=False是为了防止中文乱码,比如上面字典中的key是"姓名"是就需要设置此参数。
    # 将python对象转成json对象
    with open("demo.json", "w") as f:
        json.dump(d, f, ensure_ascii=False)
    
    • 3.直接将json对象转成Python对象,使用方法loads()
    d = json.loads(d_json)
    print("python对象d: ", d)
    
    • 4.将json对象转成Python对象,但是json对象是从json文件中读取的,此时使用的是load()方法,见下面的实例:
    # 将json对象转成python对象
    with open("demo.json", "r") as f:
        print(json.load(f))
    
    展开全文
  • Python对象加减法

    万次阅读 2020-01-07 23:38:29
    实现两个对象的相加,需实现类的__add__方法 实现两个对象的相减,需实现类的__sub__方法 complex 1 + 2j 3 + 4j """ class Complex(object): def __init__(self, x, y): self.x = x self.y = y def __add__...
    """
    实现两个对象的相加,需实现类的__add__方法
    实现两个对象的相减,需实现类的__sub__方法
    complex
    1 + 2j
    3 + 4j
    """
    
    
    class Complex(object):
    
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def __add__(self, other):
            self.x += other.x
            self.y += other.y
    
        def __sub__(self, other):
            self.x -= other.x
            self.y -= other.y
    
        def show_add(self):
            print('%d + %dj' % (self.x, self.y))
    
        def show_sub(self):
            print('%d + %dj' % (self.x, self.y))
    
    
    c1 = Complex(1, 2)
    c2 = Complex(3, 4)
    # c1 + c2
    c1.__add__(c2)
    c1.show_add()  # 4 + 6j
    # c1 - c2
    c1.__sub__(c2)
    c1.show_sub()  # 1 - 2j
    

     

    展开全文
  • python对象、类

    千次阅读 2017-12-09 12:20:28
    python对象、类 一、 python的类 类可以比作是某种类型集合的描述 把一类相同的事物叫做类,其拥有相同的属性(其实就是变量)描述,里面封装了相同的方法。比如,汽车是一个类,它包括价格、品牌等属性。   二、...

    python对象、类

    一、  python的类

    类可以比作是某种类型集合的描述

    把一类相同的事物叫做类,其拥有相同的属性(其实就是变量)描述,里面封装了相同的方法。比如,汽车是一个类,它包括价格、品牌等属性。

     

    二、  python对象

    python使用对象模型来存储数据。构造任何类型的值都是一个对象。

    所有Python对象都拥有三个特性:身份类型

    身份:每个对象都有一个唯一的身份标识,任何对象的身份可以使用内建函数id()来得到

    类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。可以使用 type()函数查看python对象的类型。type()返回的是对象而不是简单的字符串。


    :对象表示的数据。

     

    用一段代码来形象的解释一下类和对象,hp、lenovo都是一种电脑,不同的电脑又有不同的品牌,不同的价格,

    所以,笔记本电脑Laptop就表示“电脑”这一类事物,电脑有很多属性,比如品牌,价格等等。而hp,Lenovo都是电脑这个大类中的一种,它是具体的,有自己的单独的价格和品牌,所以hp、Lenovo是Laptop的一个对象那上面def printlaptop(self)中的self是什么呢,它就表示对象。

    我们调用函数时传的Lenovo对象的参数lenovo.type、lenovo.price被类中printlaptopInfo函数以self的身份接收,所以我们在使用参数的时候自然就变成了self. type、self.price。上图中标记的给对象初始化就是给对象的属性进行赋值

    有了类就有封装、继承、多态

    多态:

    多态即多种形态,在运行时确定其状态,在编译阶段无法确定其类型,这就是多态。Python中的多态和Java以及C++中的多态有点不同,Python中的变量是动态类型的,在定义时不用指明其类型,它会根据需要在运行时确定变量的类型。

    Python本身是一种解释性语言,不进行预编译,因此它就只在运行时确定其状态,故也有人说Python是一种多态语言。在Python中很多地方都可以体现多态的特性,比如内置函数len(object),len函数不仅可以计算字符串的长度,还可以计算列表、元组等对象中的数据个数,这里在运行时通过参数类型确定其具体的计算过程,正是多态的一种体现。

     

     ps:未完,待续........

    展开全文
  • Python3 Python对象持久化(pickle / shelve)

    千次阅读 2017-05-02 15:27:40
    Python3 Python对象持久化(pickle / shelve)
  • python 对象和json互相转换

    万次阅读 2017-03-18 21:38:05
    一、python对json的支持从python2.6开始...二、python对象转换成json字符串在把python对象转换成json字符串时,只需要如下知识即可:1.python对象到json字符串的转换规则: Python JSON dict object list, tuple a
  • python对象内存模型

    千次阅读 2018-05-03 12:40:42
    Python对象内存模型首先介绍一下Python对象的内存模型,如下图1所示: 图1. PyObject对象内存模型上图可以看到,一个PyObject必须包含ob_refcnt和ob_type。ob_refcnt是这个对象的引用计数,而ob_type则是指向_type...
  • 专栏自述:随着这几年机器学习火爆,楼主写了Java好多年,python其实也会写,但是缺乏系统性梳理,所以搞一个python栏目,系统性梳理的同时也把python的知识做... 7天入门Python 3 — Python对象属性及核心数据类...
  • 面试遇到一个问题:如何删除一个python对象?下面将介绍python的对象引用和 del删除引用1. 首先介绍下python的对象引用1)Python中不存在传值调用,一切传递的都是对象引用,也可以认为是传址调用。即Python不允许...
  • python对象转为字符串

    千次阅读 2020-06-01 18:09:20
    我们默认打印python对象是打印内存地址 类似java一样,name怎么然他向java的toString和JSONObject.toJSONSTring这种打印和返回时返回一个字符串 重写__repr__ def __repr__(self): return repr(self.__dict__)
  • Python对象和类序列化到MySQL

    万次阅读 2020-01-07 23:21:49
    pickle序列化对象和类到数据库,需修改mysql数据库表结构,字段类型设为二进制,如blob类型,参考: https://www.cnblogs.com/wangchunlan1299/p/7725062.html | test | CREATE TABLE `test` ( `id` int(10) unsigned ...
  • 1.Python对象生命周期

    千次阅读 2019-05-09 00:16:37
    Python对象的生命周期: 对象从诞生到消亡的过程 对象被创建时, 会在内存中分配相应的内存空间进行存储 对象不再使用, 为了节约内存, 就会把这个对象释放 __new__创建对象时调用该方法 · __new__通常用于...
  • Python对象序列化到文件

    万次阅读 2020-01-07 23:25:18
    """ 类似java对象序列化到文件 Python完美实现 """ import pickle # 写对象到文件 class Person(object): def __init__(self, name, age, address): self.name = name self.age = age self.address = a...
  • Python对象及内存管理

    千次阅读 2015-09-09 14:24:00
    对象类型标准类型 Integer、Boolean、Long integer、Floating point real number、Complex number、String、List、Tuple、Dictionary...一般程序员接触不多Python对象三个特性 身份:每个对象的唯一身份标识,可通过内
  • python对象与json字符串的相互转化

    千次阅读 2019-04-21 12:39:57
    python对象与json字符串的相互转化 在json字符串和python对象的相互转化中,会进行下列变换。 会将python中字典的写法,转化为js中对象的写法。(没有区别)。 会将python中列表的写法,转化为js中array的写法。...
  • Python对象的三个属性

    千次阅读 2016-11-29 09:31:36
    Python对象有关的三个属性分别是身份,类型和值。id,type,value。
  • python 对象转json

    万次阅读 2020-06-30 08:50:56
    对象转json是python比较常见的一个应用场景,如何来实现呢?这里会涉及json模块中的dumps方法,具体操作如下: 导入json包 import json 自定义class class Bill: def __init__(self, billCode, sendOrgCode, ...
  • python对象销毁(垃圾回收)

    万次阅读 2018-03-16 09:32:22
    '''python对象销毁(垃圾回收)''' class Point: 'info class' def __init__(self,x=0,y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ ...
  • Python对象转化为json字符串

    千次阅读 2018-11-30 18:25:10
    Python对象转化为json字符串 1、将Python对象转化为json字符串 import json person=[ { 'username':'中国', 'age':'18', 'country':'china' }, { 'username':'山东', 'age':'20', ...
  • Python对象引用和del删除引用

    万次阅读 2014-11-24 15:40:38
    为了简化内存管理,Python通过引用计数机制实现自动垃圾回收功能...每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象
  • Python对象的永久存储 1.使用Python的pickle模块 import pickle class A: def __init__(self,name,a): self.name=name self.a=a def rewrite(self,args): self.a=args ''' 遇到问题没人解答?小编创建了一个...
  • 在json字符串和python对象的相互转化中,会进行下列变换。 会将python中字典的写法,转化为js中对象的写法。(没有区别)。 会将python中列表的写法,转化为js中array的写法。(没有区别) 会将python中unicode的...
  • Python对象和容器(各种数据类型)

    千次阅读 2018-07-04 19:30:08
    python 对象类型​ 程序在启动以后,是以进程方式存在。进程中数据(变量,函数,类,容器等)保存在内存中。​ python对象是什么? ​ 由于python是弱类型语言,python中一切皆对象对象包含:变量,函数,类,...
  • 第一章-Python对象  所有Python对象都直接或间接继承自PyObject,PyObject的定义很简单: struct _object { Py_ssize_t ob_refcnt; // 引用计数 struct PyTypeObject *ob_type; // 类型对象指针 } ...
  • #一、python对象的"==、is"比较 """ 1、python的比较总是检查复合对象的所有部分,直到可以得出结果为止。 2、会自动遍历嵌套的所有数据结构,有多深走多深,首次发现的差值将决定比较的结果 """""" == :操作符测试...
  • 获取python对象占用空间的大小

    万次阅读 2011-05-13 10:36:00
    获取python对象占用空间的大小
  • python 对象是什么概念

    千次阅读 2019-07-05 17:26:17
    python里,对象就是变量,对象其实是一个指针,指向一个数据结构,数据结构里有属性,有方法。 def now(): print('2015-3-25') f = now print(f.__name__) print(f.c) 变量后面跟一个小数点,小数点后面就是它...
  • python对象属性查看

    千次阅读 2018-08-04 15:09:03
    今天就总结一下在Python中有哪些函数可以查看对象属性。 1. type() type函数用于基本类型的判断,比如int,str等,也可以判断该对象属于那个函数或类,但对于继承类来说不是很方便。 2. isinstance() isinstance...
  • Python对象序列化

    千次阅读 2018-03-22 11:23:21
    我们知道在Python中,一切皆为对象,实例是对象,类是对象,元类也是对象。本文正是要聊聊如何将这些对象有效地保存起来,以供后续使用。 pickle与cPickle      &...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,028,621
精华内容 411,448
关键字:

python对象

python 订阅