美文网首页
Python大杂烩5:值和引用所引起的动态修改list值问题

Python大杂烩5:值和引用所引起的动态修改list值问题

作者: 时间结余 | 来源:发表于2020-06-07 22:49 被阅读0次
1.场景

有一天,同事问我:“我在动态改变一个list值的时候总是不遂人愿,你帮我看看是哪里出了问题?”
她的代码是这么写的:

#fromTongshi.py
#2020.06.07
language = ["Python",0]
scores = [75,80,90]

result = []
for score in scores:
    language[-1] = score
    result.append(language)
print(result)

她想象的结果是这样的:

[['Python', 75], ['Python', 80], ['Python', 90]]

实际上结果是这样的:

[['Python', 90], ['Python', 90], ['Python', 90]]

问题出在哪里呢?

2.值和引用

在Python里,数据类型分为2种,可变类型不可变类型
可变类型:字典(dict), 集合(set), 列表(list)
不可变类型:整型(int), 字符串(string), 浮点型(float), 元组(tuple)

可变类型的对象在被调用时传递的是该对象的值。
不可变类型的对象在被调用时传递的是该对象的位于内存中的数据的引用。

来解释一下同事的难题:
language是一个可变类型的对象。在result.append(language)以后,language将它的引用传递给了result
在第1次append以后,result有了1个language的引用,此时result=[language的引用],而此时language的引用指向的数据是['Python', 75]
在第2次append以后,result有了2个language的引用,此时result=[language的引用, language的引用],而此时language的引用指向的数据是['Python', 80]
在第3次append以后,result有了3个language的引用,此时result=[language的引用, language的引用,language的引用],而此时language的引用指向的数据是['Python', 90]

3.曲线救国

如果真的想实现这个功能应该怎么做呢?
我们可以利用一个中间变量,来保证每次循环时都重新生成这个变量。
如:

language = ["Python",0]
scores = [75,80,90]

result = []
for score in scores:
    temp = language[:-1]
    temp.append(score)
    result.append(temp)
print(result)

相关文章

  • Python大杂烩5:值和引用所引起的动态修改list值问题

    1.场景 有一天,同事问我:“我在动态改变一个list值的时候总是不遂人愿,你帮我看看是哪里出了问题?”她的代码是...

  • 2021-02-18python 3-4章学习

    python有序序列和range双向索引,支持负整数索引Python基于值的自动自动存储管理 list存储值的引用...

  • 01_JS面向对象

    知识点 数据类型 值类型和引用类型 值类型和引用类型的特征 值类型和引用类型做参数 对象的动态特性 给对象动态添加...

  • python改变全局变量

    在python中,一个类中的全局变量在被引用后做修改,再次引用这个变量,是原始值还是上次引用修改后的值?demo测...

  • js 学习 -- 02

    变量、作用域和内存问题 1.基本类型值(简单的数据段),引用类型值(可能由多个值构成的对象) 2.动态属性 注意:...

  • python:sort与sorted区别

    定义 1.sort为list的内置函数,没有返回值,会修改list本身。 2.sorted为python内置函数,...

  • Python学习笔记二(变量&运算符)

    值类型&引用类型 值类型(不可变):int、str、tuple 引用类型(可变):list、set、dict 运算...

  • JS 基础知识巩固(JS面试宝典-全面透彻)

    第一章:JS 基础上篇(js 类型) 值类型 引用类型 问题:为什么对值类型和引用类型进行修改会出现不同的结果呢?...

  • Python中的“传值”和“传址”

    Python中有没有传值和传引用 这个问题似是而非,Python直接把这两个方面的问题综合了。什么是传值?在C++...

  • JS中容易出错的点

    基本类型和引用类型的赋值问题 上例很好地证明了:基本类型值按值传递,引用类型值按引用传递 同名变量和方法覆盖问题 ...

网友评论

      本文标题:Python大杂烩5:值和引用所引起的动态修改list值问题

      本文链接:https://www.haomeiwen.com/subject/ufvhtktx.html