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
也算是一种便利吧。
python 赋值,交换值理解的更多相关文章
- python之总体理解
作为脚本,python具备了弱类型语言的灵活性,便捷性.这在日常的开发使用中能够大幅度的减轻开发人员的编码负担,开发者也能够将精力集中在程序的逻辑管理和总体构架设计上.一般而言,随着经验的积累,开发人 ...
- python赋值和生成器
在python赋值过程中,对单个变量的赋值,在所有语言中都是通用的,如果是对两个变量同时进行赋值,这个时候,就会出现一点点小的差异.例如在下面的一两行代码中. a , b = b , a+b 这是同时 ...
- Python的多线程理解,转自虫师https://www.cnblogs.com/fnng/p/3670789.html
多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...
- 对python变量的理解
#!/usr/bin/python class Person: '''some words content or descriptions!''' name='luomingchuan' _age = ...
- Python赋值、浅复制和深复制
Python赋值.浅复制和深复制 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...
- python = 赋值顺序 && C++ side effect
title: python = 赋值顺序 && C++ side effect date: 2020-03-17 15:00:00 categories: [python][c++] ...
- 关于python中的增量赋值的理解
增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象 += 操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么尝试调用__add__方法,所以+= 与 + 的区别实质是 ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- python赋值和拷贝----一切皆对象,参数皆引用
摘要: 1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用. 2 python参数传递都是"传对象引用"方式.实际上相当于c++中传值和传引用的结合. 3 如 ...
随机推荐
- Angular学习(1)
天天都是hello world,老子玩1+1. 最简单的例子,见证无聊的时刻: <!DOCTYPE html> <html> <head> <title> ...
- jquery导航动画
经常在网上看到的,鼠标在导航上移动时,导航底部的横条会自动移动到鼠标悬浮的导航项上. 效果如下图: 利用jquery的 animate 函数,很好实现.代码很简单! 代码如下: <!DOCTYP ...
- IntelliJ IDEA通过Spring配置连接MySQL数据库
先从菜单View→Tool Windows→Database打开数据库工具窗口,如下图所示: 点击Database工具窗口左上角添加按钮"+",选择Import from sour ...
- DHCP协议讲解
一.DHCP服务介绍: DHCP为动态主机配置协议,该协议能自动配置主机的IP地址.子网掩码.网关及DNS服务器等TCP/IP信息.DHCP可以降低客户机IP地址配置的复杂度和网络管理成本. DHCP ...
- Screen-后台运行
文章转自:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 本来想搜集资料写一个的,结果发现该博主已经总结的很好,条理清晰. ...
- [系统开发] FileMaker进销存系统
一.简介 这是我用 FileMaker 编写的进销存系统: FileMaker 是一种在欧美流行的桌面型数据库:它使用非常方便,功能也很强大,用户可以在它上面开发自己的系统: 开发时间:2008年 二 ...
- 算法的上帝——Donald E.Knuth(转)
开始介绍前先膜拜之~ 密尔沃基市,是美国威斯康辛州最大的城市.1938年1月10日,圣诞刚过不久,密尔沃基市民像往常一样平静地生活着.咖啡店里,有人在议论着罗斯 福总统的救市新政策,有人在议论着到底该 ...
- REST总结(转)
REST总结 REST(Representational State Transfer)是代表状态传输的缩写,它代表了分布式超媒体系统的体系结构风格,它是一种针对网络应用的设计和开 ...
- JS的Data类型格式化(转)
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...
- Java注解实践--annotation学习三
注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK 基本Annotation 注解 说明 @O ...