测试知识:答案 | 第二部分 类型与操作 —— 第 6 章: 动态类型的插曲 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-大发黄金版app下载

未匹配的标注
  1. 考虑下面三个语句。它们有没有改变a打印的值?

    a = "spam"
    b = a
    b = "shrubbery"

    没有:a 仍然打印为 "spam". 当b被赋值为字符串"shrubbery"时,所有发生的是变量b被重置来指向新的字符串对象。a和b一开始共享(即,引用/指向)同样的单字符串对象”spam“,但在python中这两个名称从未相互链接。因此,设定b为不同对象对a是无效的。顺便说一下,如果这里最后语句是b = b 'shrubbery',结果是一样的——连接操作会为其结果产生新的对象,它将会只赋值给b。永远不能就地覆盖一个字符串(或数字,或元组),因为字符串是不可改变的。

  2. 考虑下面三个语句。它们有没有改变a打印的值?

    a = ["spam"]
    b = a
    b[0] = "shrubbery"

    有:a 现在打印为 ["shrubbery"]。技术上讲,没有真正改变a或b;相反,通过经变量b就地覆盖它们都引用(指向)的对象,改变了那个对象的一部分。因为a引用和b引用的同样对象,因此更新在a中也反应了出来。

  3. 这些呢——现在a有改变吗?

    a = ["spam"]
    b = a[:]
    b[0] = "shrubbery"

    没有:a仍然打印为["spam"]。通过b的就地赋值这次没有效果,因为在列表对象被赋值给b前,切片表达式创建了列表对象的一个拷贝。在第二个赋值语句后,有两个不同的列表对象有同样的值(在python中,我们说它们是==,但不是is)。第三个语句改变了被b指向的列表对象的值,但并没有改变被a指向的那个对象的值。

本文章首发在 大发黄金版app下载 网站上。

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图