精华内容
下载资源
问答
  • 首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别。 什么是可变对象,什么是不可变对象: 可变...

    首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别。

     

    什么是可变对象,什么是不可变对象:

    可变对象是指,一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值;

    不可变对象是指,一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址。

     

    深拷贝和浅拷贝需要注意的地方就是可变元素的拷贝:

    在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。

     

    举例说明:

    #encoding=utf-8

    import copy
    a=[1,2,3,4,5,['a','b']]
    #原始对象
    b=a#赋值,传对象的引用
    c=copy.copy(a)#对象拷贝,浅拷贝
    d=copy.deepcopy(a)#对象拷贝,深拷贝
    print "a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5])
    print "b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5])
    print "c=",c,"    id(c)=",id(c),"id(c[5])=",id(c[5])
    print "d=",d,"    id(d)=",id(d),"id(d[5])=",id(d[5])
    print "*"*70

    a.append(6)#修改对象a
    a[5].append('c')#修改对象a中的['a','b']数组对象
    print "a=",a,"    id(a)=",id(a),"id(a[5])=",id(a[5])
    print "b=",b,"    id(b)=",id(b),"id(b[5])=",id(b[5])
    print "c=",c,"       id(c)=",id(c),"id(c[5])=",id(c[5])
    print "d=",d,"            id(d)=",id(d),"id(d[5])=",id(d[5])

    结果:
     

    从程序的结果来看,列表a和b是赋值操作,两个对象完全指向同一个地址,a和b就是同一块地址的两个引用,其实就是一个东西,所以一个对象在修改浅层元素(不可变)或深层元素(可变)时,另一个对象也同时在变;

    c是a进行浅拷贝生成的对象,可以看到a(或b)和c两个对象整体的id是不同的,但是里面的第5个元素-列表的地址却是相同的(指向同一个地址),所以b在浅层次元素层面(不可变)增加一个元素时,c并没跟着增加,但是b的第5个元素-列表在增加一个元素时,c的第5个元素也跟着增加了,这就是因为b和c的第5个元素-列表是指向同一个地址的,这个地址上的值变了,在两个地方会同时改变;

    再看d,d的浅层次元素(不可变)和 深层次元素(可变)的地址和a,b,c都不一样,所以,a,b,c无论怎么修改,d都不会跟着改变,这就是深拷贝的结果。

     

    也可以这样理解:

    深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象

    浅拷贝,原对象的list元素改变的话会改变当前对象,如果当前对象中list元素改变了,也同样会影响原对象。

    浅拷贝就是藕断丝连

    深拷贝就是离婚了

     

    通常复制的时候要用深拷贝,因为浅拷贝后,两个对象中不可变对象指向不同地址,相互不会改变,但是两个对象中的可变元素是指向相同的地址,一个变了,另一个会同时改变,会有影响(list是可变对象)。

     

    如果要让原list和copy list没有影响怎么办?

    用深拷贝,拷贝后完全开辟新的内存地址来保存之前的对象,虽然可能地址执行的内容可能相同(同一个地址,例如’s’),但是不会相互影响。

    比如:

    List1=[‘a’,’b’,’c’]

    List2=[‘a’,’b’,’c’]

    两个列表中的’a’的地址是相同的

    Id(list1[0])=id(list2[0]),但是两个列表的地址是不同的

     

    通常来讲不可变元素包含:

    int,float,complex,long,str,unicode,tuple

    展开全文
  • Python打包原理及示例

    2020-09-23 21:10:20
    1.1. 打包原理 Python代码的基本运行过程: Python.exe调用XX.py(源码),解释并运行。 Python.exe调用XX.pyc(字节码),解释并运行。 Python.exe调用XX.pyd(机器码),调用运行。 如果有依赖的库,根据上面三种情况...

    1. 简介

    1.1. 打包原理

    Python代码的基本运行过程:

    1. Python.exe调用XX.py(源码),解释并运行。
    2. Python.exe调用XX.pyc(字节码),解释并运行。
    3. Python.exe调用XX.pyd(机器码),调用运行。
    4. 如果有依赖的库,根据上面三种情况调用运行。

    1.1.1. 方法一

    分析脚本文件,递归找到所有依赖的模块。如果依赖模块有.pyd文件,即将其复制到disk目录。如果没有.pyd文件,则生成.pyc文件拷贝到disk目录,并压缩为.zip保存。制作一个exe,导入PythonXX.dll(解析器库),并添加exe运行需要的相关运行时库。这就构成了一个不用安装Python的运行包。
    如果想生成一个exe,则利用PE结构,将整个包加载内存中,再来运行。

    1.1.2. 方法二

    .pyd是机器码文件。将.py转换成.pyd的机器码,有两种方式。一种是直接通过虚拟机生成机器码,这种方式,没有做代码优化,性能和虚拟机调用.pyc文件差不多。另一种方式,是将.py转换成而现C代码,C代码是最常见的可以直接编译生成机器码的语言。这样,可能利用C编译器本身的优化功能,可以大幅提高性能。

    2. PyInstaller

    PyInstaller就是基于方法一进行实现和优化的。

    2.1. 安装

    PyInstaller支持Win7及之后的操作系统。PyInstaller的运行需要PyWin32的Python扩展来支持。
    pip install PyWin32
    pip install PyInstaller

    2.2. 用法

    pyinstaller [options] script [script …] | specfile

    -h 显示帮助信息
    -v 显示进度信息
    -y 不显示确认信息
    –clean 清除缓存和临时文件
    -D 产生文件夹存放执行文件等,默认此设置
    -F 产生一个可执行文件
    -n NMAE NAME指定生成的exe名,默认第一个脚本名
    -w 不显示命令行窗口
    –hidden-import MODULENAME 有些库无法识别(如直接调用.py文件的方式),则需要指定,可以指定多次
    –add-data SRC;DEST 复制文本文件至指定目录
    –add-binary SRC;DEST 复制二进制文件到指定目录
    –exclude-module EXCLUDES 排除指定包或模块
    –key KEY 利用KEY作为密钥加密字节码
    -i <file.ico or file.exe> exe的图标
    –version-file FILE 版本信息

    2.2.1. 优化代码

     # run with basic optimizations
     python -O -m PyInstaller myscript.py
    # also discard docstrings
    python -OO -m PyInstaller myscript.py
    

    2.2.2. 示例

    PyInstaller只需要指定最先执行的脚本文件即可。

    1. 打包成独立exe,使用当前目录下的test.ico,生成Spy.exe

    PyInstaller -F -i test.ico -n Spy.exe test.py

    1. 打包到文件夹,不显式控制台窗口

    PyInstaller -D -w test.py

    1. 打包到文件夹,添加配置文件flash.ini到当前目录,添加FTL.Dll到DLL目录。

    PyInstaller -D --add-data flash.ini;. --add-binary FTL.DLL;DLL test.py

    1. 打包成独立exe,配置版本信息(版本信息参考pyi-grab_version)

    PyInstaller -F --version-file ver.txt test.py

    1. 打包至文件夹,添加xlwt库,排除numpy库。

    PyInstaller --hidden-import xlwt --exclude-module numpy test.py

    1. 优化打包,注意大小写

    python -O -m PyInstaller test.py

    3. Nuitka

    Nuitka打包的原理基于方法二。Nuitka是一个Python编写的Python解释器,所以Nuitka可以作为Python的扩展库使用。Nuitka会将所有没有生成pyd的模块的.py代码转换成C代码,然后调用gcc/MSVC编译成.pyd(windows DLL)。Nuitka转换的C代码使用了C11,所以C编译器尽量用最新的。

    3.1. 安装C编译器

    下载MingW的64位和32位,解压到C盘,目录安装如下。
    C:\MinGW64\mingw64\bin\gcc.exe
    C:\MinGW64\mingw32\bin\gcc.exe
    根据打包用的Python版本在环境变量中添加:
    CC=C:\MinGW64\mingwXX\bin\gcc.exe

    3.2. 安装Nuitka

    pip install nuitka

    3.3. 用法

    –module 将指定.py文件编译成.pyd文件
    –standalone 产生文件夹存放执行文件等
    –windows-icon=ICON_PATH 给exe添加图标
    –windows-disable-console 不显示控制台窗口
    –recurse-all 编译成独立exe

    3.4. 示例

    1. 默认只编译指定文件为exe

    nuitka --mingw64 test.py

    1. 打包到文件夹

    nuitka --mingw64 --standalone test.py

    1. 打包成一个exe

    nuitka --mingw64 --recurse-all test.py

    1. 添加图标,并不显示控制台

    nuitka --mingw64 --windows-icon=a.ico --windows-disable-console test.py

    4. 减小打包大小

    打包过大的原因是打包工具不能准确地识别所导入的库,导致收集了很多不需要的库。

    4.1. 显式指明模块

    imprt XX,隐式相对导入模块,打包工具会收集整个XX模块,导致打包可能收集到错误的模块。应该显式相对导入,即from YY import XX则只会收集YY库中XX模块。Python3.X中已经不推荐使用隐式相对导入。

    4.2. 排除无关库

    显式指明了导入的模块,打包工具还是有可能将扩展库中的其他没有用到的库也打包进来了。如果发现某些库是不需要的。PyInstaller可以通过–exclude-module EXCLUDES排除相关库。

    4.3. 最少安装环境

    有些无关库可以人工识别,但是有时复杂调用,人工识别较复杂。此时可以使用只安装使用的库,无关库不安装。这样打包工具就只会打包使用到的库。

    4.3.1. 虚拟机环境

    可以在VMWare等虚拟机上安装Python,然后安装打包需要的相关库,完成打包。

    4.3.2. 虚拟环境

    Python扩展库pipenv可以建立一个虚拟的Python环境,然后安装相关库,进行打包。

    # 安装pipenv
    pip install pipenv
    # 建立虚拟环境
    pipenv install
    # 进入虚拟环境
    pipenv shell
    # 安装相关模块
    pip install XXX
    # 开始打包
    pyinstaller ......
    

    5. 注意

    1. 路径为英文,最好没有空格。
    2. .py文件使用utf-8编码。
    3. 使用显式导入,即from XX import YY,可以提高PyInstaller依赖库识别,降低打包大小。
    4. 有一些库有资源,PyInstaller不能使用的识别,需要手动将库拷贝到exe所在目录。如:pyecharts库,jieba库等,然后可以删除库中代码,只保留资源即可。
    5. Nuitka功能相比PyInstaller还有不足,也存在一些Bug。通常情况下使用PyInstaller打包,追求性能使用Nuitka打包。
    展开全文
  • python爬虫原理简析

    2019-07-31 12:18:01
    一、什么是爬虫? 学习爬虫前,我们首先要先了解一下...人力工作过程:浏览器发送请求(在搜索框输入内容并搜索)-- 服务器返回搜索结果-- 肉眼筛选目标内容,通过复制或手动输入记录下来 爬虫工作过程:模拟浏览...

    一、什么是爬虫?

    学习爬虫前,我们首先要先了解一下爬虫的目的是什么?爬虫简单来说就是一个程序,这个程序会根据我们的设定,将网页上的目标内容获取并存储下来,供后续使用。

    爬虫的工作过程跟我们自己上网搜索的过程类似,爬虫是一个“拟人”的操作

    人力工作过程:浏览器发送请求(在搜索框输入内容并搜索)-- 服务器返回搜索结果 -- 肉眼筛选目标内容,通过复制或手动输入记录下来

    爬虫工作过程:模拟浏览器发送请求 -- 服务器返回搜索结果 -- 下载网页内容 -- 解析网页内容并获取目标信息 -- 存放于数据库或文件中

    二、爬虫工作流程

    1、模拟浏览器发送请求、服务器返回搜索结果、下载网页内容

    爬虫工作的前3个过程,在实际工作中是合并在一起处理的。我们会使用http库向目标站点发送一个Request,服务器能正常响应的话,会返回一个Response,下载这个Response,供后面进行我网页解析。

    发送请求下载网页常用的2个工具,一个是python自带的基础模块 urllib,一个是第三方包 requests(如果没安装,先用pip install requests安装一下),示例代码如下:

    #用urllib
    from urllib import request
    
    url='http://gz.ziroom.com/z/vr/61669497.html'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    req = request.Request(url, headers=headers)
    urlhtml = request.urlopen(req) #请求打开网页
    
    print(urlhtml.read().decode('utf-8')) #网页解码
    
    
    #用requests
    import requests
    
    url='http://gz.ziroom.com/z/vr/61669497.html'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    urlhtml=requests.get(url, headers=headers)  #请求打开网页
    #print(urlhtml)
    urlhtml.encoding='utf-8'  #网页解码
    print(urlhtml.text)  #读取网页

    2、解析网页并获取目标信息

    根据得到的数据类型不同,有不同的解析方法

    html数据:正则表达式(RE模块),第三方解析库bs4(Beautifulsoup)

    json数据:json模块

    二进制数据:wb方式

    实际爬取中,最最常遇到的是html数据,而对html数据解析最最常用的是Beautifulsoup,所以这里拿Beautifulsoup来举例解析了。

    继续上面的例子,在下载网页后,用Beautifulsoup进行结构化解析

    from bs4 import BeautifulSoup
    import requests
    
    #requests 解析网页
    url='http://gz.ziroom.com/z/vr/61669497.html'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    urlhtml=requests.get(url, headers=headers)  #请求打开网页
    urlhtml.encoding='utf-8'  #网页解码
    
    soup = BeautifulSoup(urlhtml.text,'lxml')
    print(soup)

    解析后,就是根据结果规则获取目标信息了,这里通常使用select或find定位,详细使用可以看另外两篇文档《python 爬虫之select用法》《python 爬虫之find、find_all用法》 ,这里简单用select举个例子

    from bs4 import BeautifulSoup
    import requests
     
    url='http://gz.ziroom.com/z/vr/61669497.html'
    urlhtml=requests.get(url)
    urlhtml.encoding='utf-8'
    soup=BeautifulSoup(urlhtml.text,'lxml')
    alink = soup.select('h1') 
     
    print(type(alink))
    print('------------------**----------------------')
    print(alink)
    

    3、存放数据

    存放数据的形式,基本就两种,一种是直接将数据存入数据库,一种是以文件(如:txt、xlsx等)的格式存储。

    存入数据库需要用pymssql包,先创建数据库链接再进行数据库交互;文件形式存储最常用的是用pandas库的to_excel\to_csv进行,直接举例吧

    首先是存储到数据库的方式

    #将数据写入数据库
        #连接数据库
        server = "服务器名,如果是本地数据库IP用127.0.0.1"
        user = "用户名"
        password = "密码"
        database = "数据库名"
        conn = pymssql.connect(server, user, password, database)
        cursor = conn.cursor()
        if not cursor:
            raise(NameError,"连接数据库失败")
        else:
            print('OK')
        #写入数据
        sql_xj = "INSERT INTO table1 ([年月],[日期],[来源],[区域],[类型],[套数],[面积]) VALUES (%s,%s,%s,%s,%s,%d,%d)"
        cursor.executemany(sql_xj, data_xj)
      
        # 如果没有指定autocommit属性为True的话就需要调用commit()方法
        conn.commit()
        print(time,'写入数据库成功')
        conn.close()#关闭数据库

     

    然后是pandas的存储

    #将数据导出到excel
    import pandas as pd
    df=pd.DataFrame()
    df['区域']=area
    df['日期']=date
    
    df.to_excel(r'test01.xlsx')

     

    展开全文
  • python程序执行原理

    2020-01-09 21:13:10
    python执行原理 先将解释器复制到内存中(很小),然后CPU写好的python代码进行翻译,最后CPU执行翻译好的机器语言

    python执行原理

    先将解释器复制到内存中(很小),然后CPU写好的python代码进行翻译,最后CPU执行翻译好的机器语言

    展开全文
  • 使用python复制U盘内容

    千次阅读 2018-08-10 13:42:24
    说明 在我的电脑上,U盘是H:盘,不同...我使用的版本是Python2,Python3版本原理相同。 import win32api import os import shutil s = win32api.GetLogicalDriveStrings() if &quot;H:&quot; in s: ...
  • Python程序执行原理

    2020-12-22 19:44:32
    程序执行的原理 程序 运行之前,程序是 ...操作系统会首先让 CPU 把 Python 解释器 的程序复制到 内存 中 Python 解释器 根据语法规则,从上向下 让 CPU 翻译 Python 程序中的代码 CPU 负责执行翻译完成的代码 ...
  • Python程序执行原理: 1.操作系统会首先让CPU把Python解释器的程序复制到内存中 2.Python解释器根据语法规则,从上向下让CPU翻译Python程序中的代码 3.CPU负责执行翻译完成的代码 Python的解释器有多大? 执行...
  • 以下是对列表的六种复制方式,总结来说在复制时有三种原理,其中 l1l1l1 是一种,l6l6l6 是第二种,其他的四个方法属于第三种。 import copy l = [1, 2, [3, 4]] l1 = l l2 = l.copy() l3 = l[:] l4 = list(l) l5 = ...
  • 近期在研究Python,随着学习的深入,发现越来越喜欢Python,其简洁的语法、丰富的库等,都给我这种希望快速对某个...因为相对比较简单,只要大家对Python的OS熟悉,且知道递归函数的原理,基本可以看懂。 import...
  • python 深拷贝和浅拷贝的底层原理 如果用的是a=b形式直接复制,那么相当于a和b指向了同一个内存地址。是对内存地址的引用 如果使用copy.copy进行复制,那么其实是指向了不同的地址,两个不容的地址有相同的值, 但是...
  • Python-程序执行原理

    2020-02-29 17:40:20
    操作系统先让CPU把Python解释器的程序复制到内存中 Python解释器根据语法规则,从上向下让CPU翻译Python程序中的代码 CPU负责执行翻译完的代码
  • Python的一些底层原理

    2020-10-22 10:50:42
    Python部分底层原理列表sort()排序实现引用,浅拷贝,深拷贝列表的引用:浅拷贝哈希的原理集合元素的查找字典底层实现 列表sort()排序实现 引用,浅拷贝,深拷贝 列表的引用: # 定义一个新列表 l1 = [1, 2, 3, 4, 5...
  • """ 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再...余部分复制过来即可。 """ def merge_sort(mlist): if len(mlist) <=1: return mlist #递归分解 interval = len(ml..
  • python】列表复制

    2018-01-24 12:48:53
    原理 要复制列表,首先需要创建一个包含整个列表的切片,方法是同时省略起始和终止索引([:]),即让python创建一个始于第一个元素,终止于最后一个元素的切片,便可复制整个切片。例:将‘myFoods’复制给...
  • Python 中文件的复制

    2020-09-15 15:26:24
    with open(r'D:\QQPCmgr\Desktop\ceshi.png','rb') as stream: ...Python中的文件复制有好几种形式,这里首先介绍的是通过读写方式复制文件,原理如下,先读一个文件,然后对文件进行操作,写这个文件。.
  • 比如说:绝对路径,父目录…… 但是,os文件的操作还应该包含移动 复制 打包 压缩 解压等操作,这些os模块都没有提供。 而本章所讲的shutil则就是对os中文件操作的补充。–移动 复制 打包 压缩 解压 shutil 功能: ...
  • 第一次遇到这个问题是在大学时期写编译原理大作业的时候遇到的。但是一直没有用心总结。后来在写野人和传教士,点灯问题求解的时候,也因为这个问题调试好长时间,浪费了很多时间。因此,今天总结一下,希望以后能...
  • 前段时间整天盯着python学习 群,发现好多同学对python很多内容并不是很理解,觉得有必要分享自己这段时间通过学习实践总结出来的一些东西。 写的过程中我会将一些自己理解的内容直接用文字写出来,感觉没必要去复制...
  • 本文实例讲述了Python基础之函数原理与应用。分享给大家供大家参考,具体如下: 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速...
  • 吐血总结,彻底明白 python3 编码原理 写的不错,转发学习一下,侵删。。 原文地址https://zhuanlan.zhihu.com/p/40834093 防止原文看不到了 这里粘贴复制一下:::) 关于编码的历史演变,utf-8是如何一...
  • mysql主从复制原理

    2019-01-09 00:05:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • redis主从复制原理

    2018-11-15 10:05:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • Python-UUID UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的,因为它们是不会被复制的独特标识符 但是如果只传这个已
  • deepcopy是用来进行深层复制的, 但是在实际中可能遇到, 复制一个对象后, 某些属性没了, 因此看看源码, 顺便记录下来. Python 版本: 3.6 copy模块位置: copy.py (Python的lib包里面) 源码注释 """ deepcopy的主要逻辑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 466
精华内容 186
关键字:

python复制原理

python 订阅