python什么时候用框架_关于python:框架和对象之间有什么区别,什么时候应该修改另一个?...
我开始阅读python的+=语法,无意中发现了以下文章/答案:关于的交互式代码+=
所以我注意到帧和对象之间似乎有区别。
。
在全局框架中,它们指向同一对象,即使它们是不同的变量;如果
l2 += [item]
而是
l2 = l2 + [item]
号
然后"l2"在该行运行时成为单独的对象。我最大的问题是,您希望一个变量何时指向一个单独的对象?另外,为什么和什么时候你想让它们指向同一个物体?
任何解释或用例都将非常感谢!如果您能提到任何与数据科学相关的信息,请特别感谢:)
如果我们谈论的是调用堆栈,那么帧就是包含您最直接作用域的所有本地创建对象的东西。在屏幕截图中,整个蓝色框是一个框架,包含与名称l1、l2和item相关的对象。您不能直接控制帧;您只能控制对象及其名称。
frame和object不是你所认为的意思。
在编程中,有一个称为堆栈的东西。在Python中,当调用函数时,创建一个称为堆栈帧的东西。这个框架(如您在示例中看到的)基本上只是一个包含函数局部所有变量的表。
注意,定义一个函数并不会创建一个新的堆栈框架,而是调用一个函数。例如:
def say_hello():
name = input('What is your name?')
print('Hello, {}'.format(name))
你的全球框架只是一个参考:say_hello。您可以通过检查本地名称空间中的内容(在Python中,名称空间、作用域和堆栈帧之间的关系几乎为1:1)来看到这一点:
print(locals())
号
你会看到这样的东西:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.sourcefileloader object at>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/private/tmp/fun.py', '__cached__': None, 'say_hello': }
注意dunder(双下划线的缩写)名称-这些名称是自动提供的,为了我们的讨论,您可以忽略它们。这给我们留下了:
{'say_hello': }
。
该0x位是函数本身所在的内存地址。所以这里,我们的全局堆栈/帧只包含那个值。如果调用函数,然后再次检查locals(),您将看到name不在那里。这是因为当你调用函数时,你创建了一个新的堆栈框架,变量被分配到那里。您可以通过在函数末尾添加print(locals())来证明这一点。然后你会看到这样的情况:
{'name': 'Arthur, King of the Brits'}
这里没有邓德的名字。您还将注意到,这不会显示内存地址。如果你想知道这个值在哪里,它有一个函数。
def say_hello():
name = input('What is your name?')
print('hello {}'.format(name))
print(locals())
print(id(name))
return name
print(id(say_hello()))
。
这就是这个例子在讨论帧时的含义。
但是物体呢?好吧,在Python中,一切都是一个对象。试试看:
>>> isinstance(3, object)
True
>>> isinstance(None, object)
True
>>> isinstance('hello', object)
True
>>> isinstance(13.2, object)
True
>>> isinstance(3j, object)
True
>>> def fun():
... print('hello')
...
>>> isinstance(fun, object)
True
>>> class Cool: pass
...
>>> isinstance(Cool, object)
True
>>> isinstance(Cool(), object)
True
>>> isinstance(object, object)
True
>>> isinstance(isinstance, object)
True
>>> isinstance(True, object)
True
。
它们都是物体。但它们可能是不同的物体。你怎么知道?使用id时:
>>> id(3)
4297619904
>>> id(None)
4297303920
>>> id('hello')
4325843048
>>> id('hello')
4325843048
>>> id(13.2)
4322300216
>>> id(3j)
4325518960
>>> id(13.2)
4322300216
>>> id(fun)
4322635152
>>> id(isinstance)
4298988640
>>> id(True)
4297228640
>>> id(False)
4297228608
>>> id(None)
4297303920
>>> id(Cool)
4302561896
注意,通过使用is还可以比较两个对象是否是同一个对象。
>>> True is False
False
>>> True is True
True
>>> 'hello world' is 'hello world'
True
>>> 'hello world' is ('hello ' + 'world')
False
>>> 512 is (500+12)
False
>>> 23 is (20+3)
True
。
嗯……?等等,发生了什么事?事实证明,EDOCX1(即cpython)缓存小整数。因此,对象512与添加到对象12中的对象500的结果不同。
需要注意的一点是,赋值操作符=总是为同一对象指定一个新名称。例如:
>>> x = 592
>>> y = 592
>>> x is y
False
>>> x == y
True
>>> x = y
>>> x is y
True
>>> x == y
True
不管你给一个物体取了多少个别的名字,或者即使你把这个物体传给不同的帧,你仍然拥有相同的物体。
但是当您开始收集时,了解更改对象的操作和生成新对象的操作之间的区别是很重要的。一般来说,在Python中有一些不变的类型,对它们的操作将生成一个新的对象。
至于你的问题,你想什么时候改变对象,什么时候保持它们不变,实际上是看错了方向。当您想更改内容时,您需要使用可变类型;如果不想更改内容,您需要使用不可变类型。
例如,假设您有一个组,并且希望向该组添加成员。您可以使用一个可变类型(如列表)来跟踪组,使用一个不可变类型(如字符串)来表示成员。这样地:
>>> group = []
>>> id(group)
4325836488
>>> group.append('Sir Lancelot')
>>> group.append('Sir Gallahad')
>>> group.append('Sir Robin')
>>> group.append("Robin's Minstrels")
>>> group.append('King Arthur')
>>> group
['Sir Lancelot', 'Sir Gallahad', 'Sir Robin',"Robin's Minstrels", 'King Arthur']
。
当一个小组成员被吃掉时会发生什么?
>>> del group[-2] # And there was much rejoicing
>>> id(group)
4325836488
>>> group
['Sir Lancelot', 'Sir Gallahad', 'Sir Robin', 'King Arthur']
号
你会注意到你仍然有同一个组,只是成员变了。
很有启发性的回答。后续问题:是否所有对象都在堆中?
python什么时候用框架_关于python:框架和对象之间有什么区别,什么时候应该修改另一个?...相关推荐
- python通过什么对象连接数据库_「Python」连接数据库的三种方式
连接SQLite 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果 ...
- python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )
[判断题]元组的元素是可读的,可以对元组进行更新.增加.删除操作. [多选题]哪些选项关于循环结构的描述是正确的( ) [单选题]以下可以终结一个循环的是 . [判断题]对于大量列表的连接,exten ...
- pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...
- java 爬虫框架_不知道Python爬虫?这篇文章丢给他(内含框架结构)
前言 爬虫即网络爬虫,英文是Web Spider.翻译过来就是网络上爬行的蜘蛛,如果把互联网看作一张大网,那么爬虫就是在大网上爬来爬去的蜘蛛,碰到想要的食物,就把他抓取出来. 我们在浏览器中输入一个网 ...
- python 自动化框架_学会Python+Selenium,分分钟搭建Web自动化框架!
用python+selenium实现UI自动化测试,要有一些HTML和xpth的基础,当然python基础一定是必须要会的.笔者建议花点时间了解下相关基础知识,不至于后面发懵. 一.什么是seleni ...
- python爬虫定时爬取_如何用框架给python爬虫定时?
生活中需要按时的事情很多,如果一旦错过原定的时间,就会出现一些不必要的麻烦要处理.在编程中,我们用python做测试,需要某个程序在固定的时间点启用,这就要用到python爬虫的定时功能.常用的几种定 ...
- python制作物联网控制软件下载_基于Python和Django框架的物联网智能设备管理系统的设计与实现...
论文写作指导:请加QQ229366758 基于Python和Django框架的物联网智能设备管理系统的设计与实现 作者:未知 摘 要:针对目前日益增多的智能设备提出了兼容性好,稳定性高,易于管理的管理 ...
- python 分布式计算框架_漫谈分布式计算框架
如果问 mapreduce 和 spark 什么关系,或者说有什么共同属性,你可能会回答他们都是大数据处理引擎.如果问 spark 与 tensorflow 呢,就可能有点迷糊,这俩关注的领域不太一样 ...
- python文本结构化处理_在Python中标记非结构化文本数据
python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...
最新文章
- 单目3D物体级SLAM | CubeSLAM: Monocular 3D Object SLAM
- nmap 获取主机名
- R语言-决策树-party包
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
- 多线程使用SO_REUSEPORT来实现多个socket监听同一个端口
- 如何克服工作经历中的挫折或低潮期
- 早该改了,只是我们太穷了
- 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点
- Scala Case Class
- paip.验证码识别---判断图片是否是彩色图片
- 文章三 国家助学贷款-还款
- WAP1.x协议栈浅析-WTP协议
- c语言可以在python上运行吗_c语言如何运行python脚本
- 【接口调用】EasyCVR获取直播流接口调用过程
- (转载)使用Perl编写协议分析脚本
- JdbcTempalte添加修改删除查询批量操作
- 个人空间的编辑个人资料案例(简单介绍 仅供参考)
- ccsp2018游记
- html怎么给蚊子添加颜色,蚊子喜欢什么颜色,紫色灯光可以招引蚊子
- Xcode8.1如何支持iOS8.0以下版本
热门文章
- node js Bluebird 简单介绍 promise 解决回调地狱
- 姓氏起源查询易语言代码
- JNU十日谈之三---关于爱情与等待
- python毕业设计之django+vue医院医疗救助系统
- 骨干云池服务器SATA盘的RAID配置,用两块硬盘组建RAID0磁盘阵列简单教程(图文详解)...
- 检测软键盘的弹起与隐藏【绝对经典,好用】
- 从数学角度讲解DH密钥交换算法、非对称加密、数字签名
- maven环境配置 win10,配置阿里云私服和默认仓库地址
- vue webpak版本 查看_vue 安装webpack
- tusimple数据集下载地址