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

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

Topic source

给你们一个java代码的理解

public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList(); Map<String, Object> map = new HashMap<String, Object>(); map.put("1", "a"); list.add(map);
//list = ['X','Y']相当于去掉下面的新建map的注释 //map = new HashMap<String, Object>(); map.put("1", "b"); System.out.println(list.toString());

神本贪婪

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

list = ['X','Y'],应该是新建了一个list吧,跟原来的list已经不是一个id了,而tuple用的还是原来的list,所以tuple值不变,直接修改tuple,tuple[2]=['X','Y'],可能就行了吧

这么跟你说吧,你一开始定义了一个list和t,然后你又写了一个list,这个list你为什么会认为就是你一开始定义的那个list呢?你只不过时在这里定义了一个重名的变量而已,,但是这两个变量并不指向同一个地址,既然地址不同,你第二个list肯定不会改变第一个list所以最后输出t的时候就是第一个list的值啊


例子中修改的却一定是的那个list的值,它使用了二位数组指向了那个list的地址,所以才会修改list的值,继而修改了t的内容

我感觉比较有意思的是,如果此时再来改变list[0]='1',list[1]='2',到底了原来的list还是改变了现在的list,如果改变了现在的list,那么 原来的list要怎么样才能修改

通过l[2][0]倒是可以解决定位地址改变内存内的值倒是可以

Mikemaoooo

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

T T懂吗的理解是对的,可以看后面的dict和set那章,解释了这个问题

月永夜123

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

ls = ["A", "B"] t = ("a", "b", ls) print(t) t1 = t ls1 = ls ls = ["X", "Y"]

#ls[0] = "X" print(t) print(ls1 == ls) print(ls == t[2]) print(t1 == t)

结果为:False False True ls再次赋值时候已经成为另一个变量了,跟t中的ls没关系,t中继续使用ls之前的地址

哈喽握de

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

我的理解是,tuple赋值后,变量的指向定下来了,后面list重新赋值为X,Y,是在内存里另外开辟了两个空间存储X,Y,并把list由指向A,B,改为指向x,y,但是由于tuple的指向是不可变的,所以tuple仍然是从list最初的指向读值,所以读取的仍是A,B。tuple[2][0]='X',改变的是原先的指向对应的值,因而tuple的值也就改变了。tuple[1]对应的值是常量,常量的值是不能更改的,因而修改tuple[1]的值会出错

尘封明武

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

应该是重新定义了内存地址。 开始时list指向 ['A','B',],把list赋值给元组,给与的是内存地址。 之后list被重新赋值,是给list重新赋予了一个内存地址;这时元祖内保存的还是原先的内存地址。

9537_三七

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

你现在重新赋值的方式让list的id变了,生成了一个新的list,不是之前的list了,但是t的机制是list不可变,所以失败了 课程里的方式改变的是list里面的值,但是list并没有变,所以成功了 明白?


Reply