从入门到富豪 发表于 2020-3-29 16:18:54

关于python赋值的问题

>>> old =
>>> new = old
>>> old.sort(reverse=1)
>>> new

>>> old

>>>

问题 1.当程序执行到排序后,为old重新排序, new的排序会跟着一起变。
          但是, 如果是为old重新赋值,例如:old = new的赋值不会随着一起变。
      为什么会这样, 赋值就不会影响new ,但是排序就会影响new ?求大神解惑。


>>> old =
>>> new = old
>>> old =
>>> new

xiangjianshinan 发表于 2020-3-29 16:25:39

回复: 1.当程序执行到排序后,为old重新排序, new的排序会跟着一起变。
         答:那是因为 序列 通过指针方式处理的,你的 old 与 newID是一样的。

          但是, 如果是为old重新赋值,例如:old = new的赋值不会随着一起变。
         答: 你 将 old 赋值为另一个数值,又没有赋值new 变量,故就不同啦。

xiangjianshinan 发表于 2020-3-29 16:26:47

xiangjianshinan 发表于 2020-3-29 16:25
回复: 1.当程序执行到排序后,为old重新排序, new的排序会跟着一起变。
         答:那是因为 序列...

另外,若你想产生两个 列表的,可以通过:
new = old[:]
的方式处理。

孙空空 发表于 2020-3-29 16:28:40

你对old重新赋值了但是没有对new重新赋值啊
>>>old =
>>> new = old
>>> old =
>>> new = old
>>> new
你输入这个试一下,就会输出new = 【6】

Twilight6 发表于 2020-3-29 16:34:27

本帖最后由 Twilight6 于 2020-3-29 16:37 编辑

你可以用id(old) 和id(new)查看下他们返回的id是否相同,python每个变量都有属于自己的ID ,同个ID的变量,只要改变其一,同来源的都会发生改变
如果ID相同那么这两个变量就是连在一起的,就像量子纠缠哈哈。

reverse是在原本变量上进行变化,因为old赋值的东西你在赋值给new他们来源是相同的那么如果把其中一个颠倒了也就是把来源颠倒 同来源的会一起发生改变
而你第二个是直接创建一个新的变量
,覆盖了原本的同名的变量,而且会更新该变量的id地址所以后来的变量id不同也就是来源不同就不会一起改变了



BngThea 发表于 2020-3-29 16:40:21

python中变量名只是标签而已,可以多个标签指向同一块内存
new=old
意味着new和old这两个标签指向了同一块内存
所以你对new和old指向的数据进行改动,比如列表的pop,sort,reverse等操作都会对两者同时产生作用,因为他们修改了内存中的数据
而你将old重新赋值,意味着old标签指向另外一块内存,从此old和new再无瓜葛
页: [1]
查看完整版本: 关于python赋值的问题