Nakupenda_wewe 发表于 2021-6-8 10:45:07

变量赋值

list1 = ["1","2","3","4"]
list2 = list1
list1.append('5')
list2.append('6')
print(list1)
print(list2)

这段代码得到的两个列表是相同的,都是['1', '2', '3', '4', '5', '6']。我的问题是既然list2 = list1表示将 list1 这个变量赋值给 list2,为什么增加 list2 列表中的元素也会改变 list1?

wp231957 发表于 2021-6-8 10:48:36

>>> a=[]
>>> b=a
>>> id(a)
30430216
>>> id(b)
30430216
这里的a 和b 你可以简单理解为一个东西

灰晨 发表于 2021-6-8 10:50:52

list1 = ["1","2","3","4"]
list2 = list1
list1.append('5')
list2.append('6')
print(list1)
print(list2)
print(id(list1))
print(id(list2))
两个列表地址是一样的,所以你在哪个列表加元素都是一样的

Nakupenda_wewe 发表于 2021-6-8 10:59:21

wp231957 发表于 2021-6-8 10:48
>>> a=[]
>>> b=a
>>> id(a)


a = 1
b = 2
b = a
b = 3
print(a)
print(b)

请问这段代码为什么得到的a和b的值不一样呢?a=1,b=3

wp231957 发表于 2021-6-8 11:01:13

Nakupenda_wewe 发表于 2021-6-8 10:59
请问这段代码为什么得到的a和b的值不一样呢?a=1,b=3

是的,你可以搜一下哈希

Twilight6 发表于 2021-6-8 11:01:42

本帖最后由 Twilight6 于 2021-6-8 11:04 编辑


因为 list1、list2 这两个变量所指向的 id 即内存地址相同

你的 list1 = ["1","2","3","4"] 实际上是将列表["1","2","3","4"] 的内存地址赋值给 list1

而你list2 = list1 此时也是将 列表["1","2","3","4"] 的内存地址赋值给 list2

所以 list1、list2 都指向这个地址的数据,只要列表["1","2","3","4"] 发生改变,指向这个内存地址的变量肯定随之改变

你后来的 int 这些是因为是不可变对象,Python 会将不可变变量相同的值指向同一内存地址,节省内存消耗,而不同的值肯定需要重新开辟内存

飒飒是我 发表于 2021-6-8 11:06:46

相当于list1以及list2同指向一个地址,所以会发生改变

Nakupenda_wewe 发表于 2021-6-8 11:10:04

我明白了,谢谢大家!

灰晨 发表于 2021-6-8 11:10:37

字符串是不可变的,所以你重新赋值b=3,得新生成一个内存地址,而列表是可变的,所以,list1和list2其实都是同一个列表,它并没有新生成一个列表,一直都一个内存地址一样的列表
页: [1]
查看完整版本: 变量赋值