Python两处容易理解错误的设计
- 函数内部修改可变类型的变量时不会视作局部变量(除非函数内有该变量的赋值运算符),因为如果做局部变量处理则修改语句势必报错,此处的理解不会有歧义:
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两处容易理解错误的设计的更多相关文章
- Python开发最常犯错误总结10种
不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,初学者和资深Python程序员都有可能会栽跟头.本文是Toptal网站的程序员梳理的10大 ...
- python文章装饰器理解12步
1. 函数 在python中,函数通过def关键字.函数名和可选的参数列表定义.通过return关键字返回值.我们举例来说明如何定义和调用一个简单的函数: def foo(): return 1 fo ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- [python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计 // */ // ]]> [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...
- Python一些难以察觉的错误
Python一些难以察觉的错误 今天把微博的收藏夹打开,发现以前很多收藏的好文章还没有细细研究,今天开始要慢慢研究总结总结.今天看的这篇文章地址: http://blog.amir.rachum.co ...
- 【python进阶】深入理解系统进程2
前言 在上一篇[python进阶]深入理解系统进程1中,我们讲述了多任务的一些概念,多进程的创建,fork等一些问题,这一节我们继续接着讲述系统进程的一些方法及注意点 multiprocessing ...
- python基本使用时常见错误
python基本使用时常见错误 字符编码错误 如果要学习计算机编程语言,首先就要搞懂字符编码,否则在以后的学习过程中,将会是一场噩梦.在一开始使用的时候,我就遇到了很多的关于字符编码的问题,做个简单的 ...
- Tomcat详解系列(2) - 理解Tomcat架构设计
Tomcat - 理解Tomcat架构设计 前文我们已经介绍了一个简单的Servlet容器是如何设计出来,我们就可以开始正式学习Tomcat了,在学习开始,我们有必要站在高点去看看Tomcat的架构设 ...
- 深入理解Kafka核心设计及原理(三):消费者
转载请注明出处:https://www.cnblogs.com/zjdxr-up/p/16114877.html 深入理解Kafka核心设计及原理(一):初识Kafka 深入理解Kafka核心设计及原 ...
随机推荐
- Linux:$?,$n,$#,$0
$? 获取执行上一个指令的返回值(0为成功,非零为失败) $n 获取当前执行的shell脚本的第n个参数值,n=1...9,当n=0的时表示脚本的文件名,如果n大于9,大括号括起来${10} $# 获 ...
- OceanBase 2.x体验:推荐用DBeaver工具连接数据库
Original MQ4096 [OceanBase技术闲谈](javascript:void(0) 2020-01-15 OceanBase 2.x体验:推荐用DBeaver工具连接数据库 Ocea ...
- MySQL-核心技术
1.基本查询语句 1.1使用select 语句查询一个数据表 select * from user; 1.2 查询表中的一列或多列 select id,ixdh from user; 1.3从一个表或 ...
- YC-Framework版本更新:V1.0.2
分布式微服务框架:YC-Framework版本更新V1.0.2!!! 版本更新,本次版本为V1.0.2 主要更新内容如下所示: 集成ActiveMQ; 集成微信生态(支持微信公众号.微信支付.微信开放 ...
- SQLyog 社区免费版下载
SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库,由业界著名的Webyog公司出品.使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维 ...
- Linux下安装数据库sqlite3
目录 一.简介 二.安装 三.测试 一.简介 SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎 ...
- Blazor是春天还是寒风里的挣扎
官方解释Blazor Blazor允许您使用c#而不是JavaScript构建交互式web UI. Blazor应用由可重用的web UI组件组成,这些组件使用c#.HTML和CSS实现.客户端和服务 ...
- 简单的理解 Object.defineProperty()
Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性. Object.defineProperty(obj,prop,descriptor ...
- 数据脱敏 t-closeness介绍与实现
数据脱敏 t-closeness介绍与实现 本文主要基于t-closeness的首次提出团队Ninghui Li, Tiancheng Li, Suresh Venkatasubramanian发表的 ...
- CF355B Vasya and Public Transport 题解
Content 小 \(A\) 要乘坐交通工具,其中公交车的辆数是 \(n\),第 \(i\) 辆公交车的编号为 \(i\),乘坐次数为 \(a_i\):手推车的辆数是 \(m\),每辆手推车的编号为 ...