python 赋值,交换值理解
python里的赋值都是引用,第一次赋值就是定义。
看下面两个交换值的例子:
1.
>>> a,b,c = 1,2,3
>>> a = b
>>> b = c
>>> c = a
>>> a,b,c
(2, 3, 2)
2.
>>> a,b,c = 1,2,3
>>> a,b,c = b,c,a
>>> a,b,c
(2, 3, 1)
初一看,很奇怪,这两种交换怎么会不一样呢?
简单点理解就是第一种是按顺序交换,但第2种是同时交换。
python的这种引用机制类似于c语言的指针。
a = 1 即a 引用1 这个值(a指向1)
情境1:a,b,c分别赋值1,2,3
a = b #a指向b,b又指向2,即a 指向2 a =2
b = c #b 指向c,c又指向3,即b指向3 b =3
c = a #c指向a,a又指向2(此时已经不指向1了),所以c =2
结果就是a,b,c分别为:2,3,2
情境2:a,b,c 同样分别赋值1,2,3
a,b,c = b,c,a
按照情况一的分析思路:
a指向b,b指向2 a指向2
b指向c,c指向3 b指向3
c指向a,a指向2 c指向2
如果你按这思路分析,那不是这两种交换不应该没区别吗?但结果明显不同啊
那么重点是这样理解a,b,c = b,c ,a明显不能这么理解
这交换值之前有一个前提:赋值运算的运算顺序是从右向左运算
a,b,c = b,c ,a 解释器会先找从右边计算:也是说先找到,b,c,a引用的值:2,3,1,然后向左边赋值。
结果就是:a,b,c = 2,3,1
(a = 1形象点理解就是:1(值)是个箱子,a(变量)是标签。a,b,c = 1,2,3就是将标签分别贴到这三个箱子上。
情境1:
a = b #将a贴到b所在的箱子上:a = 2
b =c #将b贴到c所在的箱子上:b =3
c = a #将c 贴到a所在的箱子上(此时a贴在数字为2的箱子上):c =2
结果:a,b,c = 2,3,2
情境2:
交换时会先找到b,c,a所在的箱子2,3,1然后将左边a,b,c三个标签对应贴上去。
结果:a,b,c = 2,3,1
)
下面是可能应用到的地方,例如下面的菲波拉契数列:
第一种赋值,需要交换。
def fab(a, b):
print(a, end=' ') temp = a
a = b
b = a + temp if a < 100:
fab(a, b) a, b = 0, 1
fab(a, b)
第二种:
def fab(a, b):
print(a, end=' ') a, b = b , a+b if a < 100:
fab(a, b) a, b = 0, 1
fab(a, b)
两种情况都输出:0 1 1 2 3 5 8 13 21 34 55 89
也算是一种便利吧。
最新文章
- 常用网络工具 ipconfig arp traceroute
- Win7 64位下PowerDesigner连接64位Oracle11g数据库
- rewrite规则中参数多于9个的处理方式 apache nginx
- 网络TCp数据的传输设计(黏包处理)
- Web安全开发注意事项
- 在JavaScript里嵌入大量字符串常量的方法
- JQuery的几种页面加载完执行三种方式
- Hibernate学习之表一对多,多对一关系
- Java中实现短信发送
- JavaScript OOP(二):this关键字以及call、apply、bind
- Assembly oth
- python基础——类名称空间与对象(实例)名称空间
- CSS 优先级&;伪元素&;伪类
- 2017.11.6 - ant design table等组件的使用,以及 chrome 中 network 的使用
- dom响应事件
- 【GOF23设计模式】--工厂模式
- 【java工具】AES CBC加密
- FATAL ERROR: Tried to use mysqladmin in group......
- BZOJ3262:陌上花开 &; 洛谷3810:三维偏序——题解
- ruby中的私有方法和保护方法
热门文章
- oracle的listener.ora sqlnet.ora tnsnames.ora三个文件的关联性
- js 自己创建ready多个可以依次加载
- 【故障处理】ORA-12162: TNS:net service name is incorrectly specified
- window.location.search
- Android Virtual Device(AVD)屏幕大小调整
- jquery 设置select 默认值
- 【转】Oracle 表空间与数据文件
- win7下vs2008编译出现C1859错误的处理办法
- 原生JavaScript实现的addclass,removeclass,hasclass,toggleclass,getbyclass
- MongoDB 3.0 导入命令