Discuss / Python / 关于tuple里面list的赋值问题?

关于tuple里面list的赋值问题?

Topic source

JcxWu

#12 Created at ... [Delete] [Delete and Lock User]

我这样理解不知道对不对。你定义的第一个list是list1,你是把list1放在了tuple里面,这里的list指向的就是list1的A,B。至于后来定义的list没有改变tuple,而是产生了一个新的变量list2.这时楼主可以看看把第一个list定义的AB改成CD看看tuple里面有没有变。如果直接用x[][]的方法修改,就是直接修改tuple里面的变量,所以可以改。语文不太好,请见谅。

我的愚见是把变量理解成一个保存地址的盒子,一个盒子只能装一个地址, list = ['A','B',]: list盒子里装了一张写有['A','B',]地址的纸条; t = ('a','b',list): t[2]拿到list盒子里的纸条复制了一份装在自己的盒子里,思考一下t[2]盒子里的纸条上写的什么,应该是['A','B',]地址吧; list = ['X','Y']: list盒子把之前的写有['A','B',]地址的纸条扔了,又重新放了一张写有['X','Y']地址的纸条, list[0] = 'A': list盒子根据盒子里存放的['X','Y']地址纸条找到['X','Y'],再对['X','Y']进行操作,对['X','Y']进行的操作影响不到list盒子里保存的地址纸条 本故事纯属虚构,欢迎指出错误

  1. list = ['A','B']
    #创建列表['A','B'],并将变量list指向该列表

  2. t = ('a','b',list)
    #创建元组('a','b',list),并将变量t指向该元组,元组中包含元素['A','B']

  3. list = ['X','Y']
    #将变量list重新赋值,指向另一个列表['X','Y'],但并不会影响t指向的元组

  4. print(t)
    ('a', 'b', ['A', 'B'])
    #输出t的值不受list指向另一个列表的变化而变化,因为变量t指向的元组是('a', 'b', ['A', 'B']),而list只是指向了另一个列表['X','Y'],列表[''A,'B']并未改变

希望可以帮到你~~

叽庅洲

#15 Created at ... [Delete] [Delete and Lock User]

内存地址变了,指针指向没变!!!

给你举个栗子:

你丫开长途的,只能跑2个线路,经常变去变来

我比你牛逼,我本来有两条固定不会变的路线,后来你觉得你跑的那两条路线不赚钱,你介绍给了我去跑,你丫去跑别的路线去了

然后有人问我现在都跑哪几条路线,你觉得应该是哪几条呢?

以上描述的关键点在于:是你介绍了我去跑你原本跑的路线,而你去跑其他路线了,我不会因为你 XJB 跑而发生改变,因为又不是我收购了你,懂了吗?

这里可以这么理解,再次对list列表进行赋值实际是对list指向做了改变,而t中的list的指向却未发生改变,所以t输出的值即最开始定义好的值。 即变量都是指向内存中的值,而不是指向某个变量名。

Thepackbacker

#18 Created at ... [Delete] [Delete and Lock User]

元祖成型一瞬间list指向的是['A','B',]的内存地址,修改list[0],这时候list的内存指向还是['A','B',],而 ['X','Y']和['A','B',]是两个不同的内存地址,当你list=['X','Y'],相当于把list的内存指向改变了,而tuple的内存指向是不可变的,我是这么理解

不知道你还记不记得python是一行一行的读取程序的,首先我们定义了元组t,指向了三个值,其中一个值为list。 而后我们改变了list的值,这样是可以的。 但是t并不知道我们已经改变了list。

所以要么就再告诉一遍t,告诉t他指向的list发生了变化。让t也知道你的改变。 list = ['A','B',] t = ('a','b',list) list = ['X','Y'] t = ('a','b',list) print(t)

或者像这样,直接告诉t他指向的东西变了 list = ['A','B',] t = ('a','b',list) t[2][0]= 'X' t[2][1]='Y' print(t)

希望可以帮到你。

安伽耶

#20 Created at ... [Delete] [Delete and Lock User]

变量指示的是指针路径,尽管 list 更新了,但是 t 并没有更新指针路径,如果再执行一遍赋值,t=('a','b',list),t 值就会改变,显示最新 list 的值。

Pixel_pig

#21 Created at ... [Delete] [Delete and Lock User]

list = ['A','B',] t = ('a','b',list) #记住(t中的list)存的是指向AB的地址,假设它地址为 P list = ['X','Y'] #把list这个变量的存的地址改为指向XY的某个地址,假设地址为 Q. //注意上行t中的list地址不变,依旧是P.

往下看,#print(list),由于上一行把Q换了地址,list = ['X','Y'] 改的是地址Q的list,与(t中的list)P无关 print(t) #输出 a b A B

list[0] = 'T' #此处修改的还是地址为 Q的list list[1] = 'V' print(list) #输出 T,V print(t) #输出 a b A B

那怎么让更改生效呢?

  • 不能通过修改list地址的方式修改,只能通过修改(t中list地址)P中的内容 list[0] = 'T',list[1] = 'V'
  • 即t中list原地址P不能更改,因为一旦重新对list赋值,会让原地址更改,修改的只会是新地址Q的list

Reply