我开始阅读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:框架和对象之间有什么区别,什么时候应该修改另一个?...相关推荐

  1. python通过什么对象连接数据库_「Python」连接数据库的三种方式

    连接SQLite 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结果 ...

  2. python中基本程序结构_关于Python 程序格式框架的描述,正确的是( )

    [判断题]元组的元素是可读的,可以对元组进行更新.增加.删除操作. [多选题]哪些选项关于循环结构的描述是正确的( ) [单选题]以下可以终结一个循环的是 . [判断题]对于大量列表的连接,exten ...

  3. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  4. java 爬虫框架_不知道Python爬虫?这篇文章丢给他(内含框架结构)

    前言 爬虫即网络爬虫,英文是Web Spider.翻译过来就是网络上爬行的蜘蛛,如果把互联网看作一张大网,那么爬虫就是在大网上爬来爬去的蜘蛛,碰到想要的食物,就把他抓取出来. 我们在浏览器中输入一个网 ...

  5. python 自动化框架_学会Python+Selenium,分分钟搭建Web自动化框架!

    用python+selenium实现UI自动化测试,要有一些HTML和xpth的基础,当然python基础一定是必须要会的.笔者建议花点时间了解下相关基础知识,不至于后面发懵. 一.什么是seleni ...

  6. python爬虫定时爬取_如何用框架给python爬虫定时?

    生活中需要按时的事情很多,如果一旦错过原定的时间,就会出现一些不必要的麻烦要处理.在编程中,我们用python做测试,需要某个程序在固定的时间点启用,这就要用到python爬虫的定时功能.常用的几种定 ...

  7. python制作物联网控制软件下载_基于Python和Django框架的物联网智能设备管理系统的设计与实现...

    论文写作指导:请加QQ229366758 基于Python和Django框架的物联网智能设备管理系统的设计与实现 作者:未知 摘 要:针对目前日益增多的智能设备提出了兼容性好,稳定性高,易于管理的管理 ...

  8. python 分布式计算框架_漫谈分布式计算框架

    如果问 mapreduce 和 spark 什么关系,或者说有什么共同属性,你可能会回答他们都是大数据处理引擎.如果问 spark 与 tensorflow 呢,就可能有点迷糊,这俩关注的领域不太一样 ...

  9. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

最新文章

  1. 单目3D物体级SLAM | CubeSLAM: Monocular 3D Object SLAM
  2. nmap 获取主机名
  3. R语言-决策树-party包
  4. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
  5. 多线程使用SO_REUSEPORT来实现多个socket监听同一个端口
  6. 如何克服工作经历中的挫折或低潮期
  7. 早该改了,只是我们太穷了
  8. 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点
  9. Scala Case Class
  10. paip.验证码识别---判断图片是否是彩色图片
  11. 文章三 国家助学贷款-还款
  12. WAP1.x协议栈浅析-WTP协议
  13. c语言可以在python上运行吗_c语言如何运行python脚本
  14. 【接口调用】EasyCVR获取直播流接口调用过程
  15. (转载)使用Perl编写协议分析脚本
  16. JdbcTempalte添加修改删除查询批量操作
  17. 个人空间的编辑个人资料案例(简单介绍 仅供参考)
  18. ccsp2018游记
  19. html怎么给蚊子添加颜色,蚊子喜欢什么颜色,紫色灯光可以招引蚊子
  20. Xcode8.1如何支持iOS8.0以下版本

热门文章

  1. node js Bluebird 简单介绍 promise 解决回调地狱
  2. 姓氏起源查询易语言代码
  3. JNU十日谈之三---关于爱情与等待
  4. python毕业设计之django+vue医院医疗救助系统
  5. 骨干云池服务器SATA盘的RAID配置,用两块硬盘组建RAID0磁盘阵列简单教程(图文详解)...
  6. 检测软键盘的弹起与隐藏【绝对经典,好用】
  7. 从数学角度讲解DH密钥交换算法、非对称加密、数字签名
  8. maven环境配置 win10,配置阿里云私服和默认仓库地址
  9. vue webpak版本 查看_vue 安装webpack
  10. tusimple数据集下载地址