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 赋值,交换值理解的更多相关文章

  1. python之总体理解

    作为脚本,python具备了弱类型语言的灵活性,便捷性.这在日常的开发使用中能够大幅度的减轻开发人员的编码负担,开发者也能够将精力集中在程序的逻辑管理和总体构架设计上.一般而言,随着经验的积累,开发人 ...

  2. python赋值和生成器

    在python赋值过程中,对单个变量的赋值,在所有语言中都是通用的,如果是对两个变量同时进行赋值,这个时候,就会出现一点点小的差异.例如在下面的一两行代码中. a , b = b , a+b 这是同时 ...

  3. Python的多线程理解,转自虫师https://www.cnblogs.com/fnng/p/3670789.html

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  4. 对python变量的理解

    #!/usr/bin/python class Person: '''some words content or descriptions!''' name='luomingchuan' _age = ...

  5. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  6. python = 赋值顺序 && C++ side effect

    title: python = 赋值顺序 && C++ side effect date: 2020-03-17 15:00:00 categories: [python][c++] ...

  7. 关于python中的增量赋值的理解

    增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象 += 操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么尝试调用__add__方法,所以+= 与 + 的区别实质是 ...

  8. python——赋值与深浅拷贝

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...

  9. python赋值和拷贝----一切皆对象,参数皆引用

    摘要: 1 python中的一切事物皆为对象,并且规定参数的传递都是对象的引用. 2  python参数传递都是"传对象引用"方式.实际上相当于c++中传值和传引用的结合. 3 如 ...

随机推荐

  1. 删除Android自带软件方法及adb remount 失败解决方案

    删除Android自带软件方法 1.在电脑上打开cmd,然后输入命令 adb remount adb shell su 2.接着就是Linux命令行模式了,输入 cd system/app 3然后输入 ...

  2. SQL 查询本月无数据用上个月的数据问题

    SQL 查询本月无数据用上个月的数据 前言 因为标题有长度限制,先简要说明一下应用场景.比如我们要查一段时间范围内(2013-08-01至2013-12-31)每个月每个运营商的用户总量,每个运营商用 ...

  3. [转]何为C10K问题

    我在学习网络编程的时候经常看到C10K问题,那么究竟什么是C10K问题呢?我看到了一篇好文章就转了过来,原文地址为:c10k问题 所谓c10k问题,指的是服务器同时支持成千上万个客户端的问题,也就是c ...

  4. [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试

    本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...

  5. Python 处理多层嵌套列表

    >>> movies =[ "the holy grail", 1975,"terry jones",91, ["graham ch ...

  6. android学习笔记40——国际化和资源自适应

    国际化——Internationalization,简称I18N. 本地化——Localization,检查L10N. java国际化资源的思路: java提供国际化资源的思路,是将程序中的标签.提示 ...

  7. 【springmvc】之常用的注解

    原理这里不叙述,只讲怎么用 1. spring mvc中的@PathVariable是用来获得请求url中的动态参数的 @RequestMapping(value="/user/{userI ...

  8. Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法

    某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...

  9. SVN:通过Client端打tag

    教你如何使用svnClient打tag~给公司人用的! 1.进入代码主目录 2.右击空白处“TortoiseSVN”—->“Branch/tag” 3.点地址栏右侧的 (选择tags存放目录) ...

  10. 兼容所有浏览器---无缝上下左右交叉运动----原生js+css

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...