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

也算是一种便利吧。

最新文章

  1. 常用网络工具 ipconfig arp traceroute
  2. Win7 64位下PowerDesigner连接64位Oracle11g数据库
  3. rewrite规则中参数多于9个的处理方式 apache nginx
  4. 网络TCp数据的传输设计(黏包处理)
  5. Web安全开发注意事项
  6. 在JavaScript里嵌入大量字符串常量的方法
  7. JQuery的几种页面加载完执行三种方式
  8. Hibernate学习之表一对多,多对一关系
  9. Java中实现短信发送
  10. JavaScript OOP(二):this关键字以及call、apply、bind
  11. Assembly oth
  12. python基础——类名称空间与对象(实例)名称空间
  13. CSS 优先级&amp;伪元素&amp;伪类
  14. 2017.11.6 - ant design table等组件的使用,以及 chrome 中 network 的使用
  15. dom响应事件
  16. 【GOF23设计模式】--工厂模式
  17. 【java工具】AES CBC加密
  18. FATAL ERROR: Tried to use mysqladmin in group......
  19. BZOJ3262:陌上花开 &amp; 洛谷3810:三维偏序——题解
  20. ruby中的私有方法和保护方法

热门文章

  1. oracle的listener.ora sqlnet.ora tnsnames.ora三个文件的关联性
  2. js 自己创建ready多个可以依次加载
  3. 【故障处理】ORA-12162: TNS:net service name is incorrectly specified
  4. window.location.search
  5. Android Virtual Device(AVD)屏幕大小调整
  6. jquery 设置select 默认值
  7. 【转】Oracle 表空间与数据文件
  8. win7下vs2008编译出现C1859错误的处理办法
  9. 原生JavaScript实现的addclass,removeclass,hasclass,toggleclass,getbyclass
  10. MongoDB 3.0 导入命令