• 函数内部修改可变类型的变量时不会视作局部变量(除非函数内有该变量的赋值运算符),因为如果做局部变量处理则修改语句势必报错,此处的理解不会有歧义:
s = 'test'
d = {True:1,2:'Second'} def f():
d['name']='China'
print(d,'\n')
s = 1
print('函数f()内的局部变量:\n\t\ts={0}\tid={1}\n'.format(s,id(s))) f()
print('全局变量:\n\t\ts={0}\tid={1}'.format(s,id(s)))

  • a+=x跟a=a+x执行后的结果看似相等,但实际结果是否同一个存储对象,取决于a是可变类型 or 不可变类型(本质上:python会优先调用内置的__iadd__,若a的类型无该方法定义则自动退化为调用__add__。并且,目前只有可变类型 list 才内置有__iadd__,其余的可变类型、所有的不可变类型只有__add__):

    print(' 下面使用 “可变类型” 进行测试 '.center(60,'*'))
    L2=L = [1,2]
    print(id(L2),id(L))
    L2 = L2 + [3,4]
    L += [3,4]
    print(L2,id(L2))
    print(L,id(L)) print(' 下面使用 “不可变类型” 进行测试 '.center(60,'*'))
    S2=S = 'Hello '
    print(id(S2),id(S))
    S2 = S2 + 'Python'
    S += 'Python'

    print(S2,id(S2))
    print(S,id(S)) print(' 下面测试下6种主要数据类型是否内置有方法__iadd__ '.center(60,'*'))
    print('int有__iadd__:',hasattr(int,'__iadd__'))
    print('str有__iadd__:',hasattr(str,'__iadd__'))
    print('tuple有__iadd__:',hasattr(tuple,'__iadd__'))
    print('dict有__iadd__:',hasattr(dict,'__iadd__'))
    print('set有__iadd__:',hasattr(set,'__iadd__'))
    print('list有__iadd__:',hasattr(list,'__iadd__'))
    ********************* 下面使用 “可变类型” 进行测试 *********************
    1969521407360 1969521407360
    [1, 2, 3, 4] 1969521390912
    [1, 2, 3, 4] 1969521407360

    ******************** 下面使用 “不可变类型” 进行测试 *********************
    1969521343216 1969521343216
    Hello Python 1969524143472
    Hello Python 1969524143408

    *************** 下面测试下6种主要数据类型是否内置有方法__iadd__ ***************
    int有__iadd__: False
    str有__iadd__: False
    tuple有__iadd__: False
    dict有__iadd__: False
    set有__iadd__: False
    list有__iadd__: True Process finished with exit code 0

Python两处容易理解错误的设计的更多相关文章

  1. Python开发最常犯错误总结10种

    不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头.本文是Toptal网站的程序员梳理的10大 ...

  2. python文章装饰器理解12步

    1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 fo ...

  3. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  4. [python 译] 基于面向对象的分析和设计

    [python 译] 基于面向对象的分析和设计 // */ // ]]>   [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...

  5. Python一些难以察觉的错误

    Python一些难以察觉的错误 今天把微博的收藏夹打开,发现以前很多收藏的好文章还没有细细研究,今天开始要慢慢研究总结总结.今天看的这篇文章地址: http://blog.amir.rachum.co ...

  6. 【python进阶】深入理解系统进程2

    前言 在上一篇[python进阶]深入理解系统进程1中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing ...

  7. python基本使用时常见错误

    python基本使用时常见错误 字符编码错误 如果要学习计算机编程语言,首先就要搞懂字符编码,否则在以后的学习过程中,将会是一场噩梦.在一开始使用的时候,我就遇到了很多的关于字符编码的问题,做个简单的 ...

  8. Tomcat详解系列(2) - 理解Tomcat架构设计

    Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...

  9. 深入理解Kafka核心设计及原理(三):消费者

    转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16114877.html 深入理解Kafka核心设计及原理(一):初识Kafka 深入理解Kafka核心设计及原 ...

随机推荐

  1. JVM——对象已“死”的判定

    主要针对Java堆和方法区 1.判断对象是否已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在对堆进行回收之前,首先应该判断这些对象哪些还"存活",哪 ...

  2. recyclerView DiffUtil使用

    DiffUtil是和RecyclerView一块用的,DiffUtil用来比较两个数据集,他的最大用处是在RecyclerView刷新时,不在无脑. 以前adapter.notifyDataSetCh ...

  3. mysql key与index的区别

    key包含了index, 而index没有key的功能. 1.key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括primary ...

  4. zabbix之监控面试

    先用shell脚本把值取出来,然后重启agent,在server端用zabbix-get命令测试一下,看能不能通过userparameter指定的可以将值取出来,如果没问题,在在网页创建模板,加监控项 ...

  5. 数据源(Data Source

    数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体.在数据源中存储了所有建立数据库连接的信息.就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数 ...

  6. 实现android自动化测试部署与运行Shell脚本分享

    我的配置是linux 64, android4.2.2的sdk. 实现的细节都在代码注释里了,变量名以及echo的内容也是说明的一部分. 主流程为: 1.检测是否指定端口的模拟器已经运行,若有则关闭2 ...

  7. 【MySQL】学生成绩

    统计每个人的总成绩排名 select stu.`name`,sum(stu.score) as totalscore from stu GROUP BY `name` order by totalsc ...

  8. [BUUCTF]REVERSE——[BJDCTF 2nd]guessgame

    [BJDCTF 2nd]guessgame 附件 步骤: 例行查壳儿,64位程序,没有壳儿 64位ida载入,习惯性的检索程序里的字符串,看到了一串类似flag的字符串,拿去提交,成功 BJD{S1m ...

  9. PowerDotNet平台化软件架构设计与实现系列(08):缓存平台

    几乎所有后端应用都会或多或少用到缓存,尤其是分布式缓存服务,以及和本地缓存构造的二级缓存.根据我们一贯的节约代码的风格,为了复用的目标,抽象出缓存平台,进行缓存管理. 考虑到很多公司都会自己造或者直接 ...

  10. CF1520D Same Differences 题解

    Content 给定 \(n\) 个数 \(a_1,a_2,\dots,a_n\),求有多少个二元组 \((i,j)\) 满足: \(i<j\). \(a_j-a_i=j-i\). 数据范围:\ ...